判定是否是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)\) 就可以判定是否为二的幂次!

posted @ 2025-09-21 12:17  Ruochen_xia  阅读(6)  评论(0)    收藏  举报