一:传统将十进制转为二进制时对该数取模,若模为1则该二进制位为1否则为0,依次除2,
int count_one_bits1(unsigned int value){
int count = 0;
while (value){
if (value % 2 == 1){
count++;
}
value /= 2;
}
return count;
}
二:利用位操作符‘&’将该数与1进行按位与,然后将1依次左移至该数的最高位,若该数位上为1相与为1,否则为0,可求出1的个数。
int count_one_bits2(unsigned int value){
int i = 0;
int count = 0;
while (i<sizeof(int)*8){
if (value &(1<<i)){
count++;
}
i++;
}
return count;
}
三:将该数与原数减一的结果相与也可求出1的个数,一个数减一后最低位的1变成0,1以后的数位都为1,相与为0,故每次减一相与后可计数1的个数。
int count_one_bits3(unsigned int value){
int num = 0;
while (value){
value= (value & (value - 1));
num++;
}
return num;
}
以上三种计算方法都可以讲1的个数返回,但一,二两种方法需要对每一位进行判断,其时间复杂度较高。而第三种方法该二进制数有几个1比较几次即可。