题目: 实现一个方法,来判断一个正整数是否是2的整数次幂(如:16是2的4次方,返回true;18不是2的整数次幂,则返回false)。要求性能尽可能高。
解题思路:
- 我们将2的整数次幂转换成二进制数,会发现2的整数次幂只有最高位是1,其它位都是0,如下所示:
十进制 | 二进制 | 是否为2的整数次幂 |
---|---|---|
8 | 1000 | 是 |
16 | 10000 | 是 |
32 | 100000 | 是 |
64 | 1000000 | 是 |
100 | 1100100 | 否 |
- 将我们将2的整数次幂各自减1,再转换成二进制,会发现其二进制数字都为1;
十进制 | 二进制 | 原数值-1 | 是否为2的整数次幂 |
---|---|---|---|
8 | 1000 | 111 | 是 |
16 | 10000 | 1111 | 是 |
32 | 100000 | 11111 | 是 |
64 | 1000000 | 111111 | 是 |
100 | 1100100 | 1100011 | 否 |
- 这时我们将原数值(2的整数次幂)和它减1的结果进行按位与运算,也就是
n&(n-1)
,会发现2的整数次幂与它本身减1的结果进行位于运算,其结果都必定是0;反之,如果一个整数不是2的整数次幂,结果一定不是0。
十进制 | 二进制 | 原数值-1 | n&(n-1) | 是否为2的整数次幂 |
---|---|---|---|---|
8 | 1000 | 111 | 0 | 是 |
16 | 10000 | 1111 | 0 | 是 |
32 | 100000 | 11111 | 0 | 是 |
64 | 1000000 | 111111 | 0 | 是 |
100 | 1100100 | 1100011 | 1100000 | 否 |
代码实现:
//判断num是不是2的整数次幂
public static boolean isPowerOf2(int num){
return (num&num-1)==0;
}