整数的二进制表示中1的个数 【微软面试100题 第二十八题】

题目要求:

  输入一个整数,求该整数的二进制表示中有多少个1.

  例如输入10,由于其二进制表示作为1010,有两个1,因此输出2.

  参考资料:剑指offer第10题、编程之美2.1

题目分析:

  方法1 除2取余法:一个数a%2的值为0或者1,根据是a的二进制表示的最低位为0,则前面结果为0;【取模和取余的效率比较低。】

  方法2 位操作法:例如a = 0011,a先与0x01&操作,得到一个1,然后a右移为0001,再与0x01&操作,又得到一个1,求和为2;

  方法3 查表法:把所有可能的值放到一个数组中,只要输入一个就直接查表即可。这样时间复杂度为O(1)。【这种方法对于8位的比较方便,如果是16位、32位、、、要建立这个数组就非常麻烦了。因此这种方法的算法只适用于需要频繁使用的地方,通过空间复杂度来换取时间复杂度。

  方法4 Hamming weight(汉明重量):先用2位存储邻近2位里面的1的个数,然后合并,用4位表示邻近4位里面的1的个数,再合并、、、

  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值