2的幂有一个特点,就是其二进制数中只有一位为1,其余位均为0.
1 : 000001
2 : 000010
4 : 000100
8 : 001000
16:010000
32:100000
…
而2的幂减一则有如下特征:
0 : 000000
1 : 000001
3 : 000011
7 : 000111
15:001111
31:011111
根据这个性质我们可以找到一个性质
num&(num-1)==0
负数由于有符号位,通过上面的判断即可排除(负数交负数还是负数)。而当num=0时,由于0不是2的幂又满足上式,则需要单独排除。排除0以后,函数就写成这样:
bool isPowerOfTwo(int num){
if(num>0 && num&num-1==0) return true;
return false;
}
非常实用的编程小技巧。