Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(n&;(n-1))==0和n&;(n-1)=0在C+中+;? > C++中的(n&(n-1))=0 < /代码>和 n&(n-1)=0 < >( n>代码>为整数)_C++_Bit Manipulation - Fatal编程技术网

(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。正是你在这里提出的论点。