题目:判断给定的一个数是否是2的幂次。
package com.wang.suan;
/**
* 判断给定的数是否是2的幂次
* @author wxe
* @since 0.0.1
*/
public class CheckPower {
public static void main(String[] args) {
System.out.println(checkPowerOf2(4));
}
public static boolean checkPowerOf2(int num){
if (num <= 0) {
return false;
}
return (num & (num-1)) == 0;
}
}
这么简单又高效的算法,就要归功于n & (n-1)的妙用了。
基本原理:
n&(n-1)作用:将n的二进制表示中的最低位为1的改为0,先看一个简单的例子:
n = 10100(二进制),则(n-1) = 10011 ==》n&(n-1) = 10000
可以看到原本最低位为1的那位变为0。
弄清楚了它的原理,那么到底能用在哪些方面呢?
- 求某一个数的二进制表示中1的个数
while (n >0 ) {
count ++;
n &= (n-1);
}
- 判断一个数是否是2的幂
n > 0 && ((n & (n - 1)) == 0 )