牛客网——程序员代码面试指南(更新ing)

2019.9.2
题目:给定一个32位整数,返回该整数二进制形式1的个数。
我开始想把数字转换为2进制看其中1的个数,用的是除2取余,然后发现通过率只有50%,原来是忽略了负数的存在。计算机系统中,数值一律用补码来表示和存储。这里复习一下补码(跟此题无关):正数的补码和原码相同,零的补码唯一00000000,负数的补码是其绝对值的二进制表示所有位取反再加1。这道题的思路是n&(n-1)算法,这个位运算学过,但是没怎么使用过,根本没想起来要用这个。
n&(n-1)表示将数字n的二进制形式中最低位为1的变为0,&是按位与运算符

#include"iostream"
using namespace std;
int main()
{
    int n;
    cin>>n;
    int i = 0;
    while(n)
    {
        n=n&(n-1);
        i++;
    }
    cout<<i;
    return 0;
}

算法:n&(n-1)的总结(这个博主总结的很详细,参考学习)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值