要想实现一个函数返回参数二进制中 1 的个数 首先我们那么应该清楚怎么得到二进制的每一位呢
例如11--1011 11%2=1--1就是最低位
11/2=5 --101
那么我们应该怎么得到一个数的最低位呢 按位与1 二进制位按位& 对应的二进制位有0则0 两个同时为1则为1 就能得到一个数的最低位 要想实现打印每一位 也需要右移操作 右边丢弃 左边补符号位 这也叫算数位移 第一种方法 利用最基本的思路 代码如下
int NumberOf(unsigned int n)
{
int count = 0;
int i = 0;
while (n)
{
if (n % 2 ==1)
count++;
n = n / 2;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = NumberOf(n);
printf("%d", ret);
return 0;
}
方法二 利用操作符 (n >> i) & 1 ==1
int NumberOf(unsigned int n)
{
int count = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1)
count++;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = NumberOf(n);
printf("%d", ret);
return 0;
}
方法三 该方法运行效果更优化 效率高 n = n & (n - 1)
n=11(10进制的)
n=1011
n-1=1010
n=1010 每次执行去掉一个1
n-1=1001
n=1000
int NumberOf(unsigned int n)
{
int count = 0;
while(n)
{
n = n & (n - 1);
count++;
}
return count;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = NumberOf(n);
printf("%d", ret);
return 0;
}
运行结果 如下图