bitCount函数详解

最近刷题的时候看到了这样一个奇怪的函数,一开始非常不理解,后来查阅了资料,现将它记录下来。

int bitCount(int i) {
      // HD, Figure 5-2
       i = i - ((i >>> 1) & 0x55555555);
       i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
       i = (i + (i >>> 4)) & 0x0f0f0f0f;
       i = i + (i >>> 8);
       i = i + (i >>> 16);
       return i & 0x3f;
   }

先说一下这个函数的功能:表示整型变量i转化成二进制表示时,1的个数。
一看很懵,不知所以然,接下来就开始解释了。

过程解释:

  1. 首先将整数i转换成二进制形式,如下所示:
    i = b 0 ⋅ 2 0 + b 1 ⋅ 2 1 + . . . + b 30 ⋅ 2 30 + b 31 ⋅ 2 31 i=b_0\cdot2^0 + b_1\cdot2^1+...+b_{30}\cdot2^{30}+b_{31}\cdot2^{31} i=b020+b121+...+b30230+b31231

  2. 对于i = i - ((i >>> 1) & 0x55555555);(2的二进制位0101),得到的结果为:
    i = b 0 ⋅ 2 0 + b 1 ⋅ 2 1 + . . . + b 31 ⋅ 2 31 − b 1 ⋅ 2 0 + b 3 ⋅ 2 2 + b 31 ⋅ 2 30 = ( b 0 − b 1 ) ⋅ 2 0 + . . . + b 1 ⋅ 2 1 ( b 30 − b 31 ⋅ 2 30 + b 3 1 ) = ( b 0 + b 1 ) ⋅ 2 0 + . . . + ( b 30 + b 31 ⋅ 2 30 ) i=b_0\cdot2^0+b_1\cdot2^1+...+b_{31}\cdot2^{31}-b_1\cdot2^0+b_3\cdot2^2+b_{31}\cdot2^{30}\\ =(b_0-b_1)\cdot2^0+...+b_1\cdot2^1(b_{30}-b_{31}\cdot2^{30}+b_31)\\ =(b_0+b_1)\cdot2^0+...+(b_{30}+b_{31}\cdot2^{30}) i=b020+b121+...+b31231b120+b322+b31230=(b0b1)20+...+b121(b30b31230+b31)=(b0+b1)20+...+(b30+b31230)

  3. 对于i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);(3的二进制为0011)得到结果为:
    i = ( ( b 0 + b 1 ) ⋅ 2 0 + ( b 4 + b 5 ) ⋅ 2 4 + . . . + ( b 28 + b 29 ⋅ 2 28 ) ) + ( ( b 2 + b 3 ) ⋅ 2 0 + ( b 6 + b 7 ) ⋅ 2 4 + . . . + ( b 30 + b 31 ) ⋅ 2 28 ) = ( b 0 + b 1 + b 2 + b 3 + b 4 ) ⋅ 2 0 + ( b 4 + b 5 + b 6 + b 7 ) ⋅ 2 4 + . . . + ( b 28 + b 29 + b 30 + b 31 ) ⋅ 2 28 ) = ( b 0 + b 1 + b 2 + b 3 ) ⋅ 2 0 + ( b 4 + b 5 + b 6 + b 7 ) ⋅ 2 4 + . . . + ( b 28 + b 29 + b 30 + b 31 ) ⋅ 2 28 ) i=((b_0+b_1)\cdot2^0+(b_4+b_5)\cdot2^4+...+(b_{28}+b_{29}\cdot2^{28}))+((b_2+b_3)\cdot2^0+(b_6+b_7)\cdot2^4+...+(b_{30}+b_{31})\cdot2^{28})\\ =(b_0+b_1+b_2+b_3+b_4)\cdot2^0+(b_4+b_5+b_6+b_7)\cdot2^4+...+(b_{28}+b_{29}+b_{30}+b_{31})\cdot2^{28})\\ =(b_0+b_1+b_2+b_3)\cdot2^0+(b_4+b_5+b_6+b_7)\cdot2^4+...+(b_{28}+b_{29}+b_{30}+b_{31})\cdot2^{28}) i=((b0+b1)20+(b4+b5)24+...+(b28+b29228))+((b2+b3)20+(b6+b7)24+...+(b30+b31)228)=(b0+b1+b2+b3+b4)20+(b4+b5+b6+b7)24+...+(b28+b29+b30+b31)228)=(b0+b1+b2+b3)20+(b4+b5+b6+b7)24+...+(b28+b29+b30+b31)228)

  4. 对于i = (i + (i >>> 4)) & 0x0f0f0f0f;得到的结果为:
    在这里插入图片描述

  5. 对于i = i + (i >>> 8);得到的结果为:
    在这里插入图片描述

  6. 对于i = i + (i >>> 16);得到的结果为:
    在这里插入图片描述

  7. 最后,i & 0x3f;得到的最终结果为:
    i = ∑ i = 0 31 b i i=\sum_{i=0}^{31}b_i i=i=031bi

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值