Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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
Java 请解释Kernighan';s位计数算法_Java_Algorithm_Bit Manipulation_Bit - Fatal编程技术网

Java 请解释Kernighan';s位计数算法

Java 请解释Kernighan';s位计数算法,java,algorithm,bit-manipulation,bit,Java,Algorithm,Bit Manipulation,Bit,通读之后,这个问题就直接出现了。所讨论的Java代码是 int count_set_bits(int n) { int count = 0; while(n != 0) { n &= (n-1); count++; } } 我想了解n&=(n-1)在这里实现了什么?我在另一个用于检测数字是否为2的幂的漂亮算法中看到了类似的构造,如: if(n & (n-1) == 0) { System.out.println("The n

通读之后,这个问题就直接出现了。所讨论的Java代码是

int count_set_bits(int n) {
  int count = 0;
    while(n != 0) {
      n &= (n-1);
      count++;
    }
 }
我想了解
n&=(n-1)
在这里实现了什么?我在另一个用于检测数字是否为2的幂的漂亮算法中看到了类似的构造,如:

if(n & (n-1) == 0) {
    System.out.println("The number is a power of 2");
}

在调试器中单步执行代码对我很有帮助

如果你从

n = 1010101 & n-1=1010100 => 1010100
n = 1010100 & n-1=1010011 => 1010000
n = 1010000 & n-1=1001111 => 1000000
n = 1000000 & n-1=0111111 => 0000000
所以这个迭代4次。每次迭代都以这样的方式递减该值,即设置为1的最低有效位消失


递减1将翻转最低位,并将每一位向上翻转到第一位。e、 g.如果你有1000…0000-1=0111…1111,不管它需要翻转多少位,它都会停在那里,其他位都保持不变。当您使用
n
设置最低位且只有最低位变为
0
从数字中减去1时,将切换所有位(从右到左)直到最右边的设置位(包括最右边的设置位)。 因此,如果我们将一个数字减去1,然后按位执行———————————————&mdash。通过这种方式,我们可以在循环中从右向左逐个取消设置1

循环迭代的次数等于集合的次数 点点滴滴


资料来源:

你很快,只是差不多描述了一半:)@pap我很快就开始提问了,应该停止了原因是
1000…-1=0111…
按位排列,并为您提供
0000…
的可能副本