求一个整数中二进制中1的个数
程序员文章站
2022-06-03 11:37:50
...
思想一:通过余数的方法判断
#include<stdio.h>
int main()
{
int a=0;
int i=0,count=0;
printf("请输入一个正整数:");
scanf("%d",&a);
do
{
if((a%2)==1)
{
count++;
a/=2;
}
}while(a);
printf("该正整数中二进制中1的个数:%d\n",count);
return 0;
}
缺陷:不能处理负数,负数是以补码的形式储存在内存中,在负数的补码中第一个比特位为1代表负号,所以在上面的循环中不论循环多少都不能为0,程序死循环
在移位前是个负数,仍然要保证移位后是个负数,因此移位后最高位会设为1。如果一直做右移运算,最终这个数字会变成
0xFFFFFFFF而陷入死循环。
思想二:通过位操作和右移操作符
#include<stdio.h>
int main()
{
int a=0;
int i=0,count=0;
printf("请输入一个正整数:")
scanf("%d",&a);
for(i=0;i<32;i++)//一个整数中占有四个字节,一个字节为八个比特位,因此需要循环32
{
if((a>>i)&1==1)
{
count++;
}
}
printf("该整数中二进制中1的个数:%d\n",count);
return 0;
}
通过控制1来得到二进制数中1的个数
#include<stdio.h>
int main()
{
int a=0;
int i=1,count=0,j=0;
printf("请输入一个正整数:");
scanf("%d",&a);
while(i)
{
if (a&i)
{
count++;
}
i = i << 1;
}
printf("该整数中二进制中1的个数:%d\n",count);
return 0;
}
int main()
{
int a=0;
int i=1,count=0,j=0;
printf("请输入一个正整数:");
scanf("%d",&a);
while(i)
{
if (a&i)
{
count++;
}
i = i << 1;
}
printf("该整数中二进制中1的个数:%d\n",count);
return 0;
}
思想三:通过与它自身减1相与
#include<stdio.h>
int main()
{
int a=0;
int i=0,count=0;
printf("请输入一个正整数:")
scanf("%d",&a);
while(a)
{
a&=(a-1);
count++;
}
printf("该整数中二进制中1的个数:%d\n",count);
return 0;
}
上一篇: 今日头条2018校招笔试题编程题
下一篇: Docker快速入门指南(二)-镜像安装
推荐阅读
-
剑指offer11:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(进制转换,补码反码)
-
二进制中字符串中1的个数
-
php中两个**可以直接求一个数的n次方 为什么还要有pow()函数
-
向一个数组中插入一个1~100的随机数
-
剑指offer11:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(进制转换,补码反码)
-
JavaScript求一个数组中重复出现次数最多的元素及其下标位置示例
-
用C语言写一个函数返回参数二进制中1的个数
-
我们在删除SQL Sever某个数据库表中数据的时候,希望ID重新从1开始,而不是紧跟着最后一个ID开始需要的命令
-
php实现统计二进制中1的个数算法示例
-
Java 数组练习题:随机生成10个整数,并添加到一个数组中,数组不允许添加重复的数字【多测师_何sir】