我找到了此链接可计数变量中的位数。。我觉得挺酷的,但我搞不懂为什么会起作用。有人能解释一下吗?
这是代码
unsigned int v; // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v
for (c = 0; v; c++)
{
v &= v - 1; // clear the least significant bit set
}任何帮助都是非常感谢的。
发布于 2017-09-04 00:50:23
我加入了这个答案,这与上面的答案相似,但在看待事物方面略有不同,所以它可能会对某人有所帮助。
假设我们取1111 (二进制数)并从中减去1,得到1110 &再次减去1,我们得到,1101,我们看到一个模式出现,即从二进制数减去1,将所有的0's翻转到最小的'1‘位的右边,然后将'1’本身翻转到0(假设最重要的位是最左边的位,最不重要的位是最右边的位)。
所以,假设我们有v= 14,在二进制是1110,然后得到v-1,首先把零翻转到最小值1到'1‘的右边,这给我们1111,然后把最小的1本身翻转到零,给我们1101。
现在,我们知道,在数字'v‘和' v-1’中,所有1's都将保留在最小值1的左边,其余的数字将被‘&d’变为零,因此比数字中实际设置的位数少1,也就是说,在1110的情况下,v&v-1= 1100,比它的前身设置的位数少1位。这个过程发生在相同数量的'1's中,就像我们存储在计数变量中的比特数一样。
https://softwareengineering.stackexchange.com/questions/304876
复制相似问题