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

Java经验总结

共 1120字,需浏览 3分钟

 · 2021-11-30

点击上方"java经验总结", 右上角选择“设为星标”

精品技术文章准时送上!


d163eeed40b9ff2b54a7dad31fccea95.webp题目

判断一个正整数是否是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。

代码如下:

public static boolean is2Power1(int num) {    int temp = 1;    while (temp <= num) {        if (temp == num) {            return true;        }        temp = temp << 1;//            temp = temp * 2;    }    return false;}

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


 第二种考虑(除法)

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次。

代码如下:

public static boolean is2Power2(int num) {    while (num > 1) {        if (num % 2 == 1) {            return false;        }//            num = num / 2;        num = num >> 1;    }    return true;}

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

 第三种考虑(位运算)

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

十进制二进制是否为2的整数次幂
81000
1610000
32
100000
641000000
1001100100

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


十进制二进制原数值减1是否为2的整数次幂
8
1000111
16100001111
3210000011111
641000000111111
100100000001111111

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

十进制二进制原数值减1n&n-1是否为2的整数次幂
8
10001110
161000011110
32100000111110
6410000001111110
1001000000011111111100000

怎么样会写代码了吗?

代码如下:

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

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


(完)

16e9e6331962dc2012eb5a561e6d4e1f.webp

java经验总结

长按关注置顶

java知识和技术查漏补缺,空余时间学习碎片化知识,分享开发、运维、架构等综合性知识,助力职场最后一公里与职业进阶,每天看总结,就选它。

点个在看少个bug

721aa33069183794a733f2216cfcc613.webp
浏览 19
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报