Java 请解释Kernighan';s位计数算法
通读之后,这个问题就直接出现了。所讨论的Java代码是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
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…
的可能副本