面试官:判断一个数是否为2的整数次幂

判断一个正整数是否是2的整数幂(如4是2的2次方,返回true;5不是2的整数次幂,则返回false)。要求性能尽可能高。

第一种考虑(乘法)

创建一个中间变量temp,初始值是1,然后进入一个循环,每次循环都让temp和目标值进行比较,如果相等,则说明目标是2的整数次幂,

如果不相等,则让temp乘以2,继续循环比较,直到temp的值大于目标整数时,说明整数不是2的整数次幂。

比如:18

1*2=2;2比18小继续

2*2=4;4比18小继续

4*2=8;8比18小继续

8*2=16;16比18小继续

16*2=32;32比18大退出循环,说明18不是2的整数幂。

如果目标整数的大小是n,则此方法循环次数是logn。

代码如下:

 1 public static boolean is2Power1(int num) {
 2     int temp = 1;
 3     while (temp <= num) {
 4         if (temp == num) {
 5             return true;
 6         }
 7         temp = temp << 1;
 8 //            temp = temp * 2;
 9     }
10     return false;
11 }

想一想,有没有更好的办法?

第二种考虑(除法)

2的整数次幂都能被2整除,所以进入一个循环,让目标对2求余,如果有余数,则目标不是2的整数次幂,

如果没有余数,然后目标赋值为目标除以2,直到目标小于1,当目标小于1的时候则说明明目标是2的整数次幂。

比如:18

18%2=0;18被2整除

18/2=9;目标赋值为9

9%2=1;9没被2整除退出循环,说明18不是2的整数幂。

如果目标整数的大小是n,则此方法循环次数有可能是1,2,3,4,...logn次。

代码如下:

 1 public static boolean is2Power2(int num) {
 2     while (num > 1) {
 3         if (num % 2 == 1) {
 4             return false;
 5         }
 6 //            num = num / 2;
 7         num = num >> 1;
 8     }
 9     return true;
10 }

再想一想,有没有更好的办法?

第三种考虑(位运算)

让我们看看2的整数次幂转成二进制是什么样的

十进制 二进制 是否为2的整数次幂
8 1000
16 10000
32 100000
64 1000000
100 1100100

是不是发现了,如果一个整数是2的整数次幂,那么当它转化成二进制时,只有最高位是1,其它位都是0!如果把这2的整数次幂各自减去1,在转换成二进制,会是什么样呢?

十进制 二进制 原数值减1 是否为2的整数次幂
8 1000 111
16 10000 1111
32 100000 11111
64 1000000 111111
100 10000000 1111111

是不是发现了,2的整数幂减去1时,它的二进制数字都变成1了!如果在加上&运算符会出现什么结果呢?

十进制 二进制 原数值减1 n&n-1 是否为2的整数次幂
8 1000 111 0
16 10000 1111 0
32 100000 11111 0
64 1000000 111111 0
100 10000000 1111111 1100000

怎么样会写代码了吗?

代码如下:

1 public static boolean is2Power3(int num) {
2     return (num & num - 1) == 0;
3 }

是不是很简单,只要动用所学过的知识点,联系起来,一个问题就迎刃而解!!!

原文地址:https://www.cnblogs.com/javaExperience/p/11465356.html

时间: 2024-07-31 22:12:42

面试官:判断一个数是否为2的整数次幂的相关文章

判断一个数是否为2的n次幂

参考:http://bbs.csdn.net/topics/370058619 如题,如何判断一个整数是否是2的N次方,我能想到的方法有两个 1.一直除2,看最后是否等于1.(最笨的方法) 2.转换成2进制,看是否是这个样子的:1,10,100,1000,10000,就是除了最高位是1,其他都是0,或者说只有一个1. 3.当我还在为我能想到第二个方法而沾沾自喜的时候,我看到了下面这种更巧妙的方法 1 2 3 4 5 6 7 以4(100)    7(0111)    8(1000)为例 4 & 

判断一个数是否时2的整数次方

题目描述: 给一个数字 N,判断是否是2的整数次方? 解题方向:可以根据二进制的特点,用消去一法直接得出结果. 消去一法:  N--1可以使N的最低位的1为0,所以最低位的1之后的每一位都是0,因此 N &(N--1)(核心)就可以消去最低为的1. 题解思路:由于2的整数次方二进制表示形式只有一个1,所以利用消去1法后,结果一定为0. 代码: //消去一法解是否是2的整数次方 public static boolean f(int N){ //输入的N不能为0 if((N & (N-1))

231. Power of Two 342. Power of Four -- 判断是否为2、4的整数次幂

231. Power of Two Given an integer, write a function to determine if it is a power of two. class Solution { public: bool isPowerOfTwo(int n) { return n > 0 ? (n & (n-1)) == 0 : false; } }; 342. Power of Four Given an integer (signed 32 bits), write

面试官,求求你不要问我这么简单但又刁难的算法题了

有时候面试官往往会问我们一些简单,但又刁难的问题,主要是看看你对问题的处理思路.如果你没接触过这些问题,可能一时之间还真不知道怎么处理才比较好,这种题更重要的是一种思维的散发吧,今天就来分享几道题面试中遇到的算法题(当然,不是我自己遇到过,是别人遇到过,我挑选出来的) 案例1 题目描述:求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 我去,求和居然不让用乘除法,也不准我们用循环,如果单独这两个限制的话

面试官再问你 HashMap 底层原理,就把这篇文章甩给他看

前言 HashMap 源码和底层原理在现在面试中是必问的.因此,我们非常有必要搞清楚它的底层实现和思想,才能在面试中对答如流,跟面试官大战三百回合.文章较长,介绍了很多原理性的问题,希望对你有所帮助~ 目录 本篇文章主要包括以下内容: HashMap 的存储结构 常用变量说明,如加载因子等 HashMap 的四个构造函数 tableSizeFor()方法及作用 put()方法详解 hash()方法,以及避免哈希碰撞的原理 resize()扩容机制及原理 get()方法 为什么HashMap链表会

面试官的七种武器:Java篇

起源 自己经历过的面试也不少了,互联网的.外企的,都有.总结一下这些面试的经验,发现面试官问的问题其实不外乎几个大类,玩不出太多新鲜玩意的.细细想来,面试官拥有以下七种武器.恰似古龙先生笔下的武侠世界中的七种武器.下面我为各位一一道来. (欢迎转载.转载请注明出处:http://www.cnblogs.com/hzg1981/) 长生剑=语言基础 长生剑是七种武器之首,同理,编程语言的考察也是技术面试中最基本的.这条不满足的就直接Pass了.以Java为例,语言的考察大致可以分为三个层次: 初级

一个资深java面试官的“面试心得”

在公司当技术面试官几年间,从应届生到工作十几年的应聘者都遇到过.先表达一下我自己对面试的观点: 1.笔试.面试去评价一个人肯定是不够准确的,了解一个人最准确的方式就是“路遥知马力,日久见人心”.通过一.二个小时内的做题.交流,只是没有其他办法下进行的无奈之举,所以通过了面试不代表有多成功,没通过也不代表有多失败.2.好的面试官本身交谈的时候就不应当把自己一个居高临下的角色上,应当把自己和应聘者当做两个做技术的人平等的交流,把自己当作权威往往就会受到观点的角度.语言表达.工作领域的惯性的制约.3.

Android开发面试经——5.常见面试官提问Android题(更新中...)

关注finddreams博客: http://blog.csdn.net/finddreams/article/details/44513579 一般的面试流程是笔试完就接着是面试了,面试时技术经理会问你一些你工作中遇到的Android方面的问题,谈谈你所做的项目,和在项目中所扮演的角色.今天我就给大家整理一些,面试中常见的面试官提的一些问题? 1.要做一个尽可能流畅的ListView,你平时在工作中如何进行优化的? ①Item布局,层级越少越好,使用hierarchyview工具查看优化. ②

java面试官如何面试别人

                                                                                  java面试官如何面试别人(一) java面试官的"面试心得" 在公司当技术面试官几年间,从应届生到工作十几年的应聘者都遇到过.先表达一下我自己对面试的观点: 1.笔试.面试去评价一个人肯定是不够准确的,了解一个人最准确的方式就是"路遥知马力,日久见人心".通过一.二个小时内的做题.交流,只是没有其他办法