位向量构建在字节数组上 - 理解位操作

时间:2012-04-01 18:46:03

标签: java bit-manipulation bit

我正在阅读一个代码,它应该使用byte数组来实现位向量 想法是如果在相应位置存在数字,则位向量具有位设置 例如。如果存在数字10,则必须设置位10等。这是一个经典概念,我得到它,但我不确定实际的实现。

我没有得到的部分是:
bitvector [num / 8] |= 1 << (num % 8);

num是要设置的数字 如果num为10,则必须使用第二个字节(到目前为止num/8确定),但1 << (num % 8)不会设置第二个字节的第二个位。可以?

3 个答案:

答案 0 :(得分:2)

10 % 8 = 2,因此1 << (10 % 8) = bit 2或值4(二进制100)

(从字节右侧开始计数位,从零开始)。验证非常简单:

7 -> 7 % 8 = 7, byte[0], Bit 7 (1 << 7).
8 -> 8 % 8 = 0, byte[1], Bit 0 (1 << 0).
9 -> 9 % 8 = 1, byte[1], Bit 1 (1 << 1).
10 -> 10 % 8 = 2, byte[1], Bit 2 (1 << 2).

答案 1 :(得分:1)

你几乎是对的:这段代码设置了第二个字节的第三个​​位。 10/8 == 110%8 == 2。一切都是一个,所以10表示“位号11”,1表示“第二个字节”,因此设置第二个字节的第三个位对于参数10是正确的。

答案 2 :(得分:1)

如果“第一”位是最低有效位,则确实如此。这是定义它的有效方法。我假设您认为第一位是最重要的位,在这种情况下您需要移位(7 - (num % 8))。你也可以这样做。