给一个整数N,确认它二进制数中1的个数

题目描述:

给一个整数N,确认它的二进制数中1的个数。

解法一

位运算:每次将1向左移动一位,和N做&与运算,再和“1向左移动一位”的那个数做比较,如果相等,说明这个二进制数位置为1,count++。

int main()
{
    int N,count;
    cin>>N;
    for(int i=0;i<32;i++)		//整形有32位,就循环32次
    {
        if((N&(1<<i))==(1<<i))
        {
            count++;
        }
    }
    cout<<count<<endl;
    return 0;
}
解法二

让N每次向右移动一次,1不动,每次和1判断是否相等。

int count=0;
for(int i=0;i<32;i++)
{
    if((N>>i)&1==1)
    {
        count++;
    }
}
cout<<count<<endl;
解法三
原理:

每次让N和N-1做&运算,每做一次运算,最末尾的1就会被消掉。其他位不变。

解释:

N-1会将N最右边的1给消掉,然后这个1之后的每一位变成1,比如二进制1000,减1后,变为0111。

所以N和N-1最低位之后的部分都是相反的,做&运算,后面这一部分就被消掉了

所以每做一次运算,最低位的1就会被消掉。

代码:
while(N)
{    
    N=N&(N-1);			//每做一次与运算,会消掉一个1.直到N为0
    count++;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值