int n;
for ( n = 0; i >0; n++)
{
i &= (i-1);
}
return n;
//也许它的功能是计算1的数量,我不知道这句话的意思是
答案 0 :(得分:2)
& is the bitwise AND operation in Java.这个函数正在做的是计算达到0所需的操作次数。
此功能正在计算" 1"的数量。在数字的二进制表示中(一些研究允许我找到this)。它的工作方式是翻转循环中每次传递的最右边的位,直到数字为零。
例如,如果我们在100上运行此函数:
1100100 & 1100011 = 1100000 //Flipped the rightmost one bit (100 & 99)
1100000 & 1011111 = 1000000 //Then the next (96 & 95)
1000000 & 0111111 = 0000000 //And finally the last (64 & 63)
因此循环将执行3次,表示3" on"数字100中的位。
答案 1 :(得分:2)
这确实计算了i值中的一位数。但它确实只对正值有效。 JRE提供的Integer.bitCount(i)也是如此,它在恒定时间和负值下工作。
至于它是如何工作的,如果你不熟悉二进制算术,很难理解。基本上发生的是,在每个循环中,最低有效设置位取消,并且当所有位被取消时循环停止。
对于负值,它无法正常工作,因为选择的循环条件很差。它应该是i!= 0而不是i> 0,然后它也适用于负值。
答案 2 :(得分:0)
这意味着擦除1的最后一位。
例如,我们计算8
的1个数字。
循环1:8和7。
8 = 0b1000
7 = 0b0111
我们得到了8 & 7 = 0
。
由于我们只有一个1。结果将是1。
如果我们为7
计算1个数字。
循环1:7和6
7 = 0b111
6 = 0b110
我们得到了7 & 6 = 6
。如您所见,6 = 0b110
,我们擦除了1的最后一位。然后,我们计算
Loop2:6和5
6 = 0b110
5 = 0b101
我们得到了6 & 5 = 4
。如您所见,4 = 0b100
,我们擦除了1的最后一位。然后,我们计算
Loop3:4和3
4 = 0b100
3 = 0b011
我们得到了4 & 3 = 0
。
由于我们有三个循环,因此7
的1个为3。