重温C语言时,记录一些学习时的收获吧
这个例子中,需要统计函数的整形参数表达成二进制形式后,其中值为1的位的个数。
首先想到的是用位运算符,将参数不断进行右移,每次与1进行&运算就能判断最右边一位是否为1。
函数的代码很简单:
int bitcount(unsigned x){
int n;
for(n=0; x!=0; x>>=1)
if(x&01)
n++;
return n;
}
其中一个细节是将x声明为unsigned类型,可以保证在x右移过程中,无论在什么机器运行,左边补上的位都将是0 .
下面对程序进行一些改进:
实际上我们可以用 x&(x-1)来消除x中最右边一位为1的值
int bitcount(unsigned x){
int n;
for(n=0; x!=0; x&(x-1))
n++;
return n;
}
我们以一个八位二进制数来举例: 10010010
第一步 10010010&10010001=10010000
第二步 10010000&10000001=10000000
第三步 10000000&01111111=00000000
此时n=3 而该八位二进制数也恰好回到0
假如以上一个方法对该8位二进制数进行统计,需要移位8次,进行八次比较
而用x&(x-1) 只需要三步
只有在极端情况下,即八位全为1,则需进行八次&操作,与八次移位次数一样多。
所以总的来说 新的方案的运行速度会稍快一些。