——————————————————————————————————————————————————————————————————————
题目:
输入一个整数 n ,输出该数32位二进制表示中1的个数。
示例:
输入 | 输出 |
---|---|
10 | 2 |
-1 | 32 |
整数以32位二进制补码的形式储存,二进制首位表示符号位
正数原码反码补码相同,负数反码=原码按位取反符号位不变,补码=反码+1。
本题有三种算法:
算法一:
利用%确定1的个数,/进行最后一位的删除。
int count_one_bit(unsigned int n)
{
int count = 0;
while(n) //当n为0时,跳出循环。
{
if(n%2 == 1)
{
count++; //计算1的个数
}
n = n/2;
}
return count; //返回1的数量总和
}
注:因为整数存在负数形式,形参要用unsigned表示
完整代码:
#include <stdio.h>
int count_one_bit(unsigned int n)
{
int count = 0;
while(n)
{
if(n%2 == 1)
{
count++;
}
n = n/2;
}
return count;
}
int main()
{
int n = 0;
scanf("%d",&n);
int ret = count_one_bit(n);
printf("%d\n",ret);
return 0;
}
算法二:
利用&进行个数的统计
int count_one_bit(int n)
{
int count = 0;
int i = 0;
for(i = 0; i < 32; i++) //二进制32位进行32次循环
{
if(((n>>i)&1) == 1) //&用法:对位相同则为1
{
count++;
}
}
return count;
}
完整代码:
#include <stdio.h>
int count_one_bit(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 = count_one_bit(n);
printf("%d\n",ret);
return 0;
}
算法三:
利用n = n&(n-1)进行对二进制的运算
int count_one_bit(int n)
{
int count = 0;
while(n)
{
n = (n & (n-1)); //每执行一次,二进制中最右边的1就会被消除
count++;
}
return count;
}
完整代码:
#include <stdio.h>
int count_one_bit(int n)
{
int count = 0;
while(n)
{
n = (n & (n-1));
count++;
}
return count;
}
int main()
{
int n = 0;
scanf("%d",&n);
int ret = count_one_bit(n);
printf("%d\n",ret);
return 0;
}
欢迎各位大佬斧正🧍♂️,如有问题请评论留言,感谢大家支持🙏