【C语言笔记】如何判断一个数二进制中“1”的个数(C语言)
代码+注释
//使用移位操作符(右移操作)
#include<stdio.h>
int main()
{
int num = 6;//0b110,2个一
int count = 0;
while (num)
{// 让二进制的每一位&(逻辑与)1,如果得到的结果为数字“1”,则二进制数该位有一个“1”。
if ((num & 1) == 1)//按位运算,自动转换为二进制去运算
{
count++;//相当于循环的次数
}
num = num >> 1;//num的二进制数每次循环右移一位
}
printf("num中1的个数有:%d", count);
return 0;
}
以上为第一种常规方法
还有一种较难的最高效算法
//巧妙运用数字之间的关系(最高效算法)
#include <stdio.h>
int main()
{
int num = 6;
int count = 0;
while (num)
{
num = num & (num - 1); //减一看是否要借位(二进制的借位),易知某一位与上它减1一定清零,
//即1&(1-0)=0或0&(0-1)=0,当(0-1)时要触发借位(向高一位借1),
//那么高一位同样是减1,也有可能发生借位,那么一个循环周期内就可能产生多次
//多次借位,即触发借位的次数越多,需要循环的次数越少;所以没发生借位的
//就是那些二进制数中为1的位,且为1的位数与循环次数呈1:1关系,所以num中1的个数就是count值
count++;
}
printf("num中1的个数:%d\n", count);
return 0;
}