计算一个数字的二进制中有几个数字1

一、使用while循环
 

int main()
{
    int a = 0;
    int count = 0;
    printf("请输入一个数字:>");
    scanf("%d", &a);
    while (a)
    {
        if(a % 2 == 1)
        count++;
        a = a / 2;
    }
    printf("二进制中有%d个1\n",count);
    return 0;
}

上面的方法无法计算负数的情况(但将int a = 0   改成 unsigned int a = 0   就可以成功 )

二、使用移位操作符和位操作符

13的二进制是00000000000000000000000000001101
  1的二进制是00000000000000000000000000000001

需要将13的二进制位逐个向右移动,只要 按位与1 的结果是 1,那么就说明这一位是1

int main()
{
    int a = 0;
    int count = 0;
    int i;
    printf("请输入一个数字:>");
    scanf("%d", &a);
    for (i = 0; i < 32; i++)
    {
        if ((1& (a >> i))== 1)
            count++;
    }
    printf("二进制中有%d个1\n",count);
    return 0;
}

可以计算负数

三、运用n=n&(n-1)

int main()
{
    int n = 0;
    int count = 0;
    int i;
    printf("请输入一个数字:>");
    scanf("%d", &n);
    while (n)
    {
        n = n & (n - 1);
        count++;
    }
    printf("二进制中有%d个1\n", count);
    return 0;
}

这个表达式能将n的二进制中最右边的1去掉,最终n的值会变成0。

所以执行了多少次这个表达式,就说明有多少个二进制数1

四、判断一个数是否是2的n次方(   运用n=n&(n-1)   )

因为2的n次方的数字的二进制都是最左边有一个1,其他的都是0.


1(十进制)------   1    (二进制)
2(十进制)-------  10   (二进制)
4(十进制)-------  100  (二进制)
8(十进制)-------  1000 (二进制)

 

int main()
{
    int n;
    scanf("%d", &n);
    if ((n & (n - 1)) == 0)//  只需一次值就成了0
        printf("该数字是2的次方\n");
    else
        printf("该数字不是2的次方\n");
    return 0;
}

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值