警告
第二次查看您的代码后,我必须说,它可能编译得很好,但是您会遇到死锁,我确实认为:
for (i=1;i<=n;++i)
{
i = (i)&(i-1);
cont++;
}
会发生什么?i
什么时候1
:
i = 1&0;//is what line 4 boils down to
i
也会如此,0
如果循环开始,则n
至少为 1,所以循环条件仍然为真:
i<=n => 0 <= n ==> true
Soi
增加1
( i++
),然后整个事情又开始了。第四行再次计算为:
i = 1&0;//assigns 0 again to i
你又回到了原点。这个程序永远不会终止,它只会一遍又一遍地重复相同的操作......
嗯,&
是按位与运算符。它在使用时,如在您的带有 2 个整数的代码段中,它返回“打开”或1
在两个数字中设置为的位。用简单的英语:表达式计算为一组新的位,这些位在两个操作数中都设置了。以 2 的时间为例i
:
00000010 //2
00000001 // i - 1
--------
00000000
在这种情况下,在这两种情况下都没有设置为1
。事实上,这将是所有 2 的幂的事实,因为 2 的幂在二进制中看起来像这样:
00000010
00000100
00001000
2 减 1 的幂如下所示:
00001000//power of 2
00000111
在所有其他情况下,至少有 1 位1
在两种情况下都设置为:
00000110
00000101
--------
00000100
简单的。
有关 C 中按位运算符的更完整概述和详细说明,您可以随时参考关于 C 中按位运算符的 wiki