题目:对于一个字节(8bit)的变量,求其二进制“1”的个数。例如6(二进制0000 0110)“1”的个数为2,要求算法效率尽量高。
解法一:除法
对于二进制数来说,除一个2,就少一位,可以判断这个少的位来确定“1”的个数。
例如:6(0000 0110)
0000 0110 / 2 = 0000 0011 ----少的一位为0
0000 0011 / 2 = 0000 0001 ----少的一位为1
0000 0001 / 2 = 0000 0000 ----少的一位为1
操作数数已经为0,到此结束
参考代码
int Count_1(int val)
{
int num = 0;
while(val)
{
if(val % 2 != 0) //用取模获得去除的一位
++num;
val /= 2;
}
return num;
}
性能:时间复杂度O(log2v),即二进制数的位数;空间复杂度O(1)
解法二:移位
对于二进制数来说,除法是用移位完成。
例如:6(0000 0110)
0000 0110 >> 1 = 0000 0011 ----少的一位为0
0000 0011 >> 1 = 0000 0001 ----少的一位为1
0000 0001 >> 1 = 00