Java - 位操作(数量为1的计数)

时间:2017-07-03 00:29:08

标签: java bit-manipulation

有人可以向我解释为什么这种方法有效吗,我已经完成了它的工作,但为什么这样做呢。二进制数有一种模式吗?例如,在i = 3时,为什么res [1] + 1得到2. res [3>> 1] +(3& 1)有助于计算二进制数3?中的1的数量。

代码应该做什么:它有效,所以不用担心。它应该返回一个列表,其中包含每个数字的二进制表示中的1的数量,直到num + 1。并且num总是> = 0.因此对于num = 5,你会得到[0,1,1,2,1,2],其中最后一个索引表示二进制表示为5的1的数量,并且第一个索引是二进制代表为0的那个。

代码:

public int[] countBits(int num) {
        int[] res = new int[num+1];

        for (int i = 0; i<num+1; i++){
            res[i] = res[i >> 1] + (i & 1);
        }

        return res;
    }

这是我无法解决的问题:

res[i] = res[i >> 1] + (i & 1);

编辑 - 这不是作业,所以请完整解释你的答案。这是为了帮助面试。

3 个答案:

答案 0 :(得分:1)

 int[] res = new int[num+1];

    for (int i = 0; i<num+1; i++){
        res[i] = res[i >> 1] + (i & 1);
    }

    return res;

重写为

 int[] res = new int[num+1];

    for (int i = 0; i<num+1; i++){
        x = res[i >> 1];
        y = (i & 1);
        res[i] = x + y;
    }

    return res;

创建一个数组以适合答案,+ 1?

每个

,从低端开始。

res[0] = res[0] + 0&1 = 0 + 0 = 0;
res[1] = res[0] + 1&1 = 0 + 1 = 1;
res[2] = res[1] + 0&1 = 1 + 0 = 0;
res[3] = res[1] + 1&1 = 1 + 1 = 2;

看看这种模式,我可以看到,由于正确的移位,以及与&amp;屏蔽,它将问题分成2,一个由于迭代顺序而先前已经解决的问题,以及对最后一个问题的检查数字。

假设为8位int,为简洁起见,

1 = 00000001
2 = 00000010
3 = 00000011

将二进制文件拆分为多个部分。

i    i>>1      y&1
1 = 0000000     1
2 = 0000001     0
3 = 0000001     1

因此,它获取数组前半部分中1的结果,然后计算最后一位数。

由于迭代次序和数组初始化值,这可以保证有效。

对于值&lt; 0,由于2的恭维它变得毛茸茸,这就是为什么它只适用于值&gt; = 0

答案 1 :(得分:0)

in&#39; res [i] = res [i&gt;&gt; 1] +(i&amp; 1);&#39;

一个数字的结果分为两部分

  • 最后一位是否为1,可以通过(i&amp; 1)计算。
  • 第一个(n-1)位,该数字等于res [i>&gt; 1]&#39; bitcount.this是一个简单的递归调用

答案 2 :(得分:0)

  1. shift by 1给出楼层数除以2.
  2. 如果数字的最后一位为1
  3. ,则AND 1返回1

    希望下表有助于了解发生了什么:)只需我的2美分。

    <pre>
    --------------------------------
    <b>
    #   8   4   2   1  >>1  &1  Ans
    </b>
    -------------------------------
    0   0   0   0   0   0   0   0
    1   0   0   0   1   0   1   1
    2   0   0   1   0   1   0   1
    3   0   0   1   1   1   1   2
    4   0   1   0   0   2   0   1
    5   0   1   0   1   2   1   2
    6   0   1   1   0   3   0   2
    7   0   1   1   1   3   1   3
    8   1   0   0   0   4   0   1
    9   1   0   0   1   4   1   2
    10  1   0   1   0   5   0   2
    11  1   0   1   1   5   1   3
    12  1   1   0   0   6   0   2
    13  1   1   0   1   6   1   3
    14  1   1   1   0   7   0   3
    15  1   1   1   1   7   1   4
    </pre>