求一个二进制数字中1的个数?

编程之美:




数字之美:
1:求一个二进制数字中1的个数?例如10101001


方法一:除法 除去2 数字除以二相当于二进制下数字右移一位,查看除以2的余数是否为0可得这位是否为1.循环除,直到数字为0为止



int count_1_num(int bn)
{
    int num=0;
    while(bn){
        if(bn%2 == 1){
   num++;
}
        bn = bn/2;
    }
    return num;
}


方法二:移位 使数字和0x01进行&操作,获取数字的最后移位是否为1,再数字右移一位,思想和方法一差不多,只是移位操作比除法


操作更加节省时间空间。


int count_1_num(int bn)
{
    int num = 0;
    while(bn){
        num += bn & 0x01;
        bn = bn>>0x01;
    }
    return num;
}


方法三:减法  使数字与本身减一进行&操作,算法思想是每次改变最低位为1的值,例如二进制01010010 - 1 = 01010001 ,与运算一


次去掉一个二进制中的1,直到数字变为0,二进制中的1被全部去掉。


int count_1_num(int bn)
{
    int num = 0;
    while(bn){
        bn & = (bn -1)
        num++;
    }
    return num;
}


方法四:枚举 枚举出所有的可能,switch选择,如果数字比较大,不适合,小数字还行。


方法五:查表法:提前把所有可能计算好填写在表格内,直接获取,空间换时间的方法,时间复杂度仅为o(1).
int coun t Table【256】 ={
0, 1, 1, 2, 1. 2 . 2, 3. 1, 2, 2, 3, 2, 3, 3, 4, 1. 2 . 2, 3. 2, 3, 3, 4, 2, J .
3. 4, 3, 4. 4, 5, 1, 2, 2, J . 2, 3, 3, 4, 2, J. 3. 4, 3, 4, 4, 5. 2, 3. 3,
4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5 . 5, 6. 1, 2, 2 . 3, 2, 3, 3, 4, 2. 3. 3. 4,
3, 4, 4, 5, 2, 3, 3, 4, 3. 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6. 2, 3. 3, 4, 3,
4, 4, 5. 3. 4, 4, 5. 4, 5, 5, 6, 3, 4, 4, 5. 4, 5, 5. 6, 4, 5, 5, 6, 5, 6,
6, 7, L 2 . 2, 3, 2, 3, 3, 4, 2, 3, 3. 4, J . 4, 4, 5, 2, 3, 3, 4, 3 . 4, 4,
5. 3, 4. 4. 5 . 4, 5, 5, 6. 2 . 3. 3, 4, 3 . 4, 4, 5, 3, 4, 4, 5. 4, 5. 5. 6.
3, 4, 4, 5, 4, 5, 5, 6. 4, 5 . 5, 6. 5, 6, 6, 7, 2, 3, 3. 4, 3. 4. 4, 5. 3,
4, 4, 5, 4, 5. 5, 6, J . 4, 4, 5, 4, 5, 5, 6, 4, 5 . 5. 6. 5. 6. 6, 7, 3, 4,
4, 5, 4, 5. 5. 6, 4, 5. 5, 6 . 5, 6, 6, 7, 4, 5 . 5. 6, 5. 6  }


int count_1_num(int bn)
{
    return table[bn];
}




通过这些方法主要是想根据自己的需求灵活使用不同的方法,最佳的实现功能,锻炼思维。



















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值