求一个整数中二进制中1的个数

思想一:通过余数的方法判断

#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;
}


思想三:通过与它自身减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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值