
#include
int main()
{
int num = 0;
int count = 0;
printf("存储一个数:");
scanf("%d", &num);
while (num)
{
if (num % 2 == 1)
count++;
num = num / 2;
}
printf("二进制中1的个数=%d\n",count);
return 0;
首先大家要了解一个十进制的数怎么转变为一个二进制的数;
简单来说就是一个数除2后得到一个商和一个余数,余数放在末尾,商继续除2,依次往复,知道商为0为止;
例如:7/2=3....1 然后 3/2=1....1 在1/2=0....1
因此7的二进制就是111;
所以按照上述代码可以计算出二进制中1的个数;
但是这个方法只能求得正数二进制中1的个数,因为负数在内存中的补码是和原码相反+1,所以无法求得负数的情况;
方法2:#include
int main()
{
int num = 0;
int count = 0;
int i = 0;
printf("请输入你要储存的数:");
scanf("%d", &num);
for (i = 0; i < 32; i++)
{
if (((num>>i)&1)==1)
{
count++;
}
}
printf("二进制中1的个数=%d\n", count);
}
看这段代码前我们得先知道&和>>的用法:
就是两个数在二进制上进行比较,同为1则是1
例如:3&5=1
00000000000000000000000000000011
00000000000000000000000000000101
00000000000000000000000000000001
而>>则是把二进制往右移一位:
00000000000000000000000000000011
00000000000000000000000000000001
所以我们可以利用&和>>让要求的数和1进行比较,32次后就能求出二进制中1的个数
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)