对于一个字节(8bit)的无符号数整型变量,求其二进制表示中”1″的个数,要求算法的执行效率尽可能高。
-《编程之美》P119原话。
看到这题,我立刻想到了,我之前写的那个博客求1的个数,应该很简单,果断test一下吧。
int func(unsigned char x)
{
if(x>256) throw "Argument is out of arrange";
int count=0;
while(x)
{
count++;
x=x&(x-1);
}
return count;
}
结果正确,不过注意要判断一下传入参数的范围,可能溢出,并且如果没有做判断的话,可能对溢出的数据做截断处理,而不会出现运行错误之类的。
方法二:<<编程之美>>上的解法
因为知道数据的范围,为unsiged char 型,我们可以直接对位操作啊。利用移位操作,只不过时间复杂度可能多一点,但是位运算速度快。
代码:
int func(unsigned char x)
{
if(x>256) throw "Argument is out of arrange";
int count=0;
while(x)
{
if(x&(0x01))
{
count++;
}
//i++;
x>>=1;
}
return count;
}
当然除2求余跟这个思想差不多。
书上还列举了俩个方法:
一个是利用case,枚举完所有的情况,反正只有8个bit嘛。但是这个思想,每次都得判断case的条件。最好的方法是:利用数组枚举完所有的情况,彻底利用空间换时间。数组下标是256中情况,数组存的是1的个数,可以在O(1)内完成。真他妈狠。