(n&;(n-1))==0和n&;(n-1)=0在C+中+;? > C++中的(n&(n-1))=0 < /代码>和 n&(n-1)=0 < >( n>代码>为整数)
假设它们测试数字(n&;(n-1))==0和n&;(n-1)=0在C+中+;? > C++中的(n&(n-1))=0 < /代码>和 n&(n-1)=0 < >( n>代码>为整数),c++,bit-manipulation,C++,Bit Manipulation,假设它们测试数字n是否为2的幂(尽管第二个数字没有达到注释中提到的效果)。这是基于一个简单的观察结果,即在二进制表示中,幂2是唯一一位设置为1的数字。如果你从这个数字中减去1,你会得到一个1s的序列 示例(正面): n = 32 n = 6 而不是二进制表示 n = 100000 n = 110 然后 n-1=011111 所以如果你取n-1&n你得到0 示例(否定): n = 32 n = 6 而不是二进制表示 n = 100000 n = 110 现在 所以((n-1)&n)
n
是否为2的幂(尽管第二个数字没有达到注释中提到的效果)。这是基于一个简单的观察结果,即在二进制表示中,幂2是唯一一位设置为1
的数字。如果你从这个数字中减去1
,你会得到一个1
s的序列
示例(正面):
n = 32
n = 6
而不是二进制表示
n = 100000
n = 110
然后
n-1=011111
所以如果你取n-1&n
你得到0
示例(否定):
n = 32
n = 6
而不是二进制表示
n = 100000
n = 110
现在
所以((n-1)&n)==100>0
请注意,正如@harold在他的评论中提到的,0
也将通过这项测试。正如卢卡斯兹所说
它检查数字n是否是2的幂
说明:-
如果n=3或不是2的幂的任何其他数字
(n=3,所以(n-1)=2)
3:-0000 0011
2:-0000 0010
比和操作:-0000 0010
如果n=2或任何其他为2的幂的数字
(n=2 so(n-1)=1)
2 :- 0000 0010
1:-0000 0001
超过和运行:-0000
因此,如果数字是2的幂,它总是返回0。(n&(n-1))==0
:
n&(n-1)
取消设置n
二进制:
XXX10000
->XXX00000
所以(n&(n-1))==0
表示0
和2
的所有幂
n&(n-1)==0
:
n&(n-1)==0
相当于n&((n-1)==0)
(由于运算符的优先级),因此n==1
它用于检查两个的幂,如下所示:
bool isPowerOfTwo(int n) {
return!(n&n-1)*n>0;
}
你查过
和的意思了吗?如果没有,为什么不呢?我已经为这个软件的维护者感到抱歉了。大警告,操作员的优先级比操作员低。第一个条件测试两个值的幂,但第二行不测试,因为它等于“n&(n-1==0)”。同样,这种测试应该在一个实用函数中,并有一个有意义的名称,比如IsPowerOfTwo@galop1n或者更准确地说,ispoweroftworzero
n&(n-1)==0
相当于n&((n-1)==0)
,因此n==1
它们是不同的。&
的优先级低于=
。当然,对不起,第二个是“错误的”,最后只检查数字是否等于1。正是你在这里提出的论点。