2.1求二进制数中1的个数
题目:
对于一个字节(8bit)的无符号整型变量,求其中二进制表示中“1”的个数,要求算法的执行效率尽可能高。
解法一
对于二进制操作,除以一个2,原来的数字将会减少一个0。如果除的过程中有余,那么就表示当前位置有一个1。以10100010为例:
第一次除以2时,商为1010001,余为0。第二次除以2时,商为101000,余为1。
时间复杂度为O(logv)。
代码清单2.1
//2.1
int Count_2_1(BYTE v){
int num = 0;
while(v){
if(v % 2 == 1)
num++;
v /= 2;
}
return num;
}
解法二
我们知道位运算同样可以达到相除的目的。在右移位过程中,需要判断最后一位是否为1。时间复杂度为O(logv)。相比于解法一,效率提高了,但是时间复杂度没有改变。
代码清单2.2
//2.2
int Count_2_2(BYTE v){
int num = 0;
while(v){
num += v & 0x01;
v >>= 1;
}
return num;
}
2016-04-30补充:
考虑一种输入为负数的情况。当输入为负数时,上面代码就不能很好的运行了,因为负数的二进制表示为补码的形式(补码等于反码+1,反码等于原码所有位取反),此时v向左移位的