编程之美1——一个数的二进制表示中1的个数

这里要介绍3种解法

第一种;(常规解法)

数在计算机内部都是用二进制表示的,所以可连续用数n除2

代码1:


<span style="font-size:14px;">#include <iostream>
using namespace std;
int main(void)
{
    int n,m;
    m=0;
    cin>>n;
    while(n)
    {
        if(n%2)    //如果n不能整除2,说明当前n的末尾数为1
            m++;
        n>>=1;    //n右移1位,即n/2
    }
    cout<< m <<endl;
    return 0;
}</span>


第二种:使用位操作

&:若a为1,且b为1,则a&b为1,否则,a&b为0

这里初始化i=0x1;

n&i若为1,则n的末尾为1,否则为0

代码2:



<span style="font-size:14px;">#include <iostream>
using namespace std;
int main(void)
{
   //    使用位操作,1 和 二进制的最后一位进行 与(&) 运算
    int n,i,m;
    m=0;
    i=0x1;
    cin>>n;
    while(n)
    {
        m+=(n&i);
        n>>=1;
    }
    cout << m <<endl;
    return 0;
}</span>


第三种:使用另一种位操作

若n的二进制表示为0010 0000,则第二种算法明显有待改进

可让n与n-1进行 & 运算,若n&(n-1)==0,则为上述情况(n的二进制表示中,只有一位是 0)。


代码3:


<span style="font-size:14px;">#include <iostream>
using namespace std;
int main(void)
{  
    int n,m;
    m=0;
    cin>>n;
    while(n)
    {
        n&=(n-1);
        m++;
    }
    cout << m <<endl;
 
    return 0;
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值