C语言代码实现二进制存在多少个1的个数,请实现一个函数,输入一个整数,输出该数二进制表示中的1的个数。例:9的二进制表示为1001,有两位是1;
解题思路
如果暴力将整数变为二进制,在遍历取得1的个数。如果数据量大,这样做就大大浪费了计算机资源。我们知道一个数与1做&运算,如果这个数是1 那么结果就为1。让我们先复习一下位运算。
与运算(&)、或运算(|)、异或运算(^)
运算规则:
一:与运算符(&)
运算规则:
0&0=0;0&1=0;1&0=0;1&1=1
即:两个同时为1,结果为1,否则为0
例如:3&5
十进制3转为二进制的3:0000 0011
十进制5转为二进制的5:0000 0101
------------------------结果:0000 0001 ->转为十进制:1
即:3&5 = 1
二:或运算(|)
运算规则:
0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象,一个为1,其值为1。
例如:3|5 即 00000011 | 0000 0101 = 00000111,因此,3|5=7。
三:异或运算符(^)
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个位为“异”(值不同),则该位结果为1,否则为0。
例如:3^5 = 0000 0011 | 0000 0101 =0000 0110,因此,3^5 = 6
思路
(N-1)&N 可以将二进制中最小位为1的消掉,来个循环,当N最后一位1消掉是记录循环次数即可知道存在多少位1。
看看C语言代码
在这里插入代码片
//输入一个整数,该数二进制中存在多少个1
#include<stdio.h>
int main()
{
int N=100;
//scanf("%d",&N);
int count=0;
while(N!=0)
{
N=(N-1)&N;
count++;
}
printf("%d",count);
return 0;
}
运行截图
若存在错误,还请指出错误。