C程序设计语言 (第二版) 练习2-9
练习 2-9 在求对二的补码时,表达式x &= (x – 1)可以删除x中最右边值为1 的一个二进制位。请解释这样做的道理。用这一方法重写bitcount函数,以加快其执行速度。
解释:因为二进制的特性, 不是0 就是1, 所以x 与 x - 1的最右边值一定是互反的, 这样,x & (x - 1)的最右边的值一定为0,如此循环后x的最终值为0,循环次数即为x中值为1的个数。
注意:代码在win32控制台运行,在不同的IDE环境下,有部分可能需要变更。
IDE工具:Visual Studio 2010
代码块:
int bitcount(unsigned int x){
int b;
for(b = 0; x != 0; x >>= 1){
x &= (x - 1);
b++;
}
return b;
}
示例:
#include <stdio.h>
#include <stdlib.h>
int bitcount(unsigned int x){
int b;
for(b = 0; x != 0; x >>= 1){
x &= (x - 1);
b++;
}
return b;
}
int main(){
unsigned int x = 23;
printf("%d\n", bitcount(x));
system("pause");
return 0;
}