判定是否是2的幂次方
1.普通方法
每次除以二,看最后的余数是不是 0;
bool solve(int x){
while(x / 2 > 0 && x % 2 == 0){
x /= 2;
}
return (x != 1) ? 0 : 1;
}
2.位运算
bool solve(int x){
return !(x & x - 1);
}
为什么呢?
可以发现,如果一个数是二的幂次,二进制就会是 100...0
,就是 \(1\) 后面若干个 \(0\)。
又因为 \(n-1\) 的二进制位一定比 \(n\) 要少 \(1\) 位,根据 \(\&\) 的定义:
\[1 \& 1 = 1 \\
1 \& 0 = 0 \\
0 \& 1 = 0 \\
0 \& 0 = 0
\]
串末尾的二进制位都是 \(0\),所以结果的末尾都是 \(0\),又因为最高位会补 \(0\),所以整个串的二进制与就是 \(0\)。
所以 \(n \& (n - 1)\) 就可以判定是否为二的幂次!