java中i& =(i-1)的含义是什么?

时间:2016-07-28 19:08:57

标签: java loops bit-manipulation bitwise-operators

    int n;
    for ( n = 0; i >0; n++)
    {
        i &= (i-1);
    }
    return n;

//也许它的功能是计算1的数量,我不知道这句话的意思是

3 个答案:

答案 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。