i&=(i-1)在java中

i&=(i-1)在java中,java,loops,bit-manipulation,bitwise-operators,Java,Loops,Bit Manipulation,Bitwise Operators,//也许它的功能是计算1的数量,我不知道这个句子的意思是什么,这个功能所做的是计算它达到0所需要的操作的数量 这个函数是计算一个数字的二进制表示形式中“1”的个数(我通过一点研究发现)。其工作方式是,它在循环中的每次循环中翻转最右边的位1,直到数字为零 例如,如果我们在100上运行此函数: int n; for ( n = 0; i >0; n++) { i &= (i-1); } return n; 因此,循环将执行3次,

//也许它的功能是计算1的数量,我不知道这个句子的意思是什么,这个功能所做的是计算它达到0所需要的操作的数量

这个函数是计算一个数字的二进制表示形式中“1”的个数(我通过一点研究发现)。其工作方式是,它在循环中的每次循环中翻转最右边的位1,直到数字为零

例如,如果我们在100上运行此函数:

    int n;
    for ( n = 0; i >0; n++)
    {
        i &= (i-1);
    }
    return n;
因此,循环将执行3次,指示数字100中的3个“开”位。

此函数所做的是计算达到0所需的操作数

这个函数是计算一个数字的二进制表示形式中“1”的个数(我通过一点研究发现)。其工作方式是,它在循环中的每次循环中翻转最右边的位1,直到数字为零

例如,如果我们在100上运行此函数:

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

因此,循环将执行3次,指示数字100中的3个“开”位。

这实际上是在计算i值中的一个位的数量。但是,它只适用于正值。JRE提供的Integer.bitCount(i)也有同样的作用,它在恒定时间内工作,也适用于负值

至于它是如何工作的,如果你不熟悉二进制算术,就很难理解。基本上,在每个循环中,最低有效设置位被取消,当所有位都被取消时,循环停止


它不能正确地处理负值,因为循环条件选择不当。应该是我0而不是i>0,那么它也适用于负值。

这确实是在计算i值中的一位数。但是,它只适用于正值。JRE提供的Integer.bitCount(i)也有同样的作用,它在恒定时间内工作,也适用于负值

至于它是如何工作的,如果你不熟悉二进制算术,就很难理解。基本上,在每个循环中,最低有效设置位被取消,当所有位都被取消时,循环停止


它不能正确地处理负值,因为循环条件选择不当。应该是我0而不是i>0,那么它也适用于负值。

它意味着删除1的最后一位。 例如,对于
8
,我们计算1中的#。 循环1:8和7

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)
我们得到了
8&7=0
。 因为我们只有一个1。结果将是1

如果我们为
7
计算1的#。 循环1:7和6

8 = 0b1000
7 = 0b0111
我们得到了
7&6=6
。如您所见,
6=0b110
,我们擦除1的最后一位。然后,我们计算 循环2:6和5

7 = 0b111
6 = 0b110
我们得到了
6&5=4
。如您所见,
4=0b100
,我们擦除1的最后一位。然后,我们计算 循环3:4和3

6 = 0b110
5 = 0b101
我们得到了
4&3=0

因为我们有三个循环,所以
7
的#of 1是3。

它意味着删除1的最后一位。 例如,对于
8
,我们计算1中的#。 循环1:8和7

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)
我们得到了
8&7=0
。 因为我们只有一个1。结果将是1

如果我们为
7
计算1的#。 循环1:7和6

8 = 0b1000
7 = 0b0111
我们得到了
7&6=6
。如您所见,
6=0b110
,我们擦除1的最后一位。然后,我们计算 循环2:6和5

7 = 0b111
6 = 0b110
我们得到了
6&5=4
。如您所见,
4=0b100
,我们擦除1的最后一位。然后,我们计算 循环3:4和3

6 = 0b110
5 = 0b101
我们得到了
4&3=0

因为我们有三个循环,
7
的1的#是3。

但它回答了写下来的问题。也许答案是不完整的,但到目前为止,它并没有错。但它回答了写下来的问题。所以答案可能不完整,但到目前为止,它没有错。重复问题参考原文:@krishnakant的可能重复不,这是不同的,这是一个循环,它不仅仅是检查它是否是一个2倍的幂,重复问题参考原文:@krishnakant的可能重复不,这是不同的,这是一个循环,这不仅仅是检查它是否是2的幂