目录
题目:调试
解释代码((n & (n-1)) == 0)的具体含义?
一、思路
我们可以由外而内来解决这个问题。
1.(A&B)== 0 含义
( A & B ) = = 0 (A\&B)==0 (A&B)==0 的含义是,A和B二进制表示的同一位置绝不会同时为1。因此,如果 ( n & ( n − 1 ) ) = = 0 (n\&(n-1))==0 (n&(n−1))==0,则n和n-1就不会有共同的1。
2.相比n,n-1长什么样
如上所示:当要将一个数减去1时,需要注意最低有效位。如果最低有效位为1,则变为0,完毕。如果是0,你就必须从高位“借”1.因此,要逐一前往更高的位,将每个位从0改为1,直至找到1为止,并将这个1翻转成0,完毕。
综上所述,n-1形似n,只不过n中低位的0在n-1中变为1,n中最低有效位的1在n-1中变为0,示例如下。
3.那么, ( n & ( n − 1 ) ) = = 0 (n \& (n-1)) == 0 (n&(n−1))==0 究竟表示什么?
n和n-1不存在同一位均为1的情况,因为两者的二进制表示如下:
abcde必定全为0,也就是说,n必须形如00001000,因此,n的值是2的某次方。
综上所述,这个问题的答案为:
(
n
&
(
n
−
1
)
)
=
=
0
(n\&(n-1))==0
(n&(n−1))==0 检查n是否为2的某次方(或者检查n是否为0)