数字二进制表示中1的个数

    数字二进制表示中1的个数是多少?

    当听到这个问题的时候,会有两个声音出现在脑海里:

    1、数字位数的确定。

    2、位运算。

    先假定该数字是32位的整数,那么剩下的就是位运算了。那么该怎么位运算法呢?

    第一想到的便是,把数字右移32次,和1做与运算,这是最简单直接的思路。然而这里有一个地方要注意,如果数字是负数呢?会有什么影响?其实有没有影响,要看你的程序结束的判断条件。如果你是按次数来判断是否还需要右移,那么是不会有影响的。但是如果你是以数字右移后是否为零来判断是否结束,那么肯定是会有影响的。因为负数右移,高位补1。

    如果要避开上面的负数的问题,很简单,然后通过左移1来和数字做与运算便可。

    上面的位移方式都是直接的,没有技巧型的,效率一般,必须循环运算32次,但其实数字里面二进制1的位数很少,能不能有多少个1便计算多少次呢?

    使用n&=(n-1)的方式,每次都把数字二进制中最末尾的1给去掉,当n等于0时,便是把1都去掉了,这种做法效率更高,更有技巧性。

    还有更好的方法吗?

    当然,那就是查表法。如果能直接通过查表(哈希)得到结果,自然是高效的。问题在于如果生成表。

    32位整数,其实可以划分为4个字节,一个字节对应一个char型,那么其实可以对一个字节做一个表,对应256个字符生成对应的二进制中1的个数的对应表。生成表的时候,有个技巧,就是,第i个字符,如果i是偶数,那么它的1的位数是和i/2字符的1的位数是一样的;如果i是奇数,那么它的1的位数是i/2字符1的位数的基础上加1. 如4的1的位数和2的1的位数是一样的,5的1的位数和比2的1的位数多1. 其实就是偶数是左移得到了,基数在偶数的基础上加1.

    还有更好的方法,之后再补充吧。

    对了,其实,先判断数字是否为零,为零的话,直接就不用难过算了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值