2012-04-01 53 views
1

我读它应该实现使用byte阵列位向量代码。
这个想法是,如果在相应的位置存在一个数字,则位向量具有该位。
例如如果数字10存在,则必须设置位10等。这是一个经典的概念,我明白了,但我不确定实际的实现。位向量建立一个字节数组 - 了解位操作

的一部分,我不明白的是:
bitvector [num/8] |= 1 << (num % 8);

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

+3

为什么不打印'1 <<(num%8)'并找出? – 2012-04-01 18:47:47

+0

@OliCharlesworth:现在我觉得自己像个idiot.I太消耗想这是错误的尝试这种 – Cratylus 2012-04-01 18:52:18

回答

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). 
+0

为什么它是'1 << 2'所以6 – Cratylus 2012-04-01 18:51:15

+0

''<<是移位操作? 1 << 2是4(即第2位设置)。 – 2012-04-01 18:52:20

+0

其实它是*第三位。 – 2012-04-01 18:52:53

1

你差不多吧:这个代码将第三位第二个字节。 10/8 == 110%8 == 2。一切是关闭的一个,所以10表示“比特数11”,1分表示“第二字节”,因此设置第二个字节的第三比特为10。

+0

我现在看到了。我在想第10位,从左到右依次是10。第一个8位,第二个字节中的第十个是从左边开始的,但是正好相反。 – Cratylus 2012-04-01 19:16:11

1

它确实参数是正确的,如果“第一“位是最不重要的位。这是定义它的有效方式。我假设你认为第一位是最重要的位,在这种情况下,你需要移动(7 - (num % 8))。你也可以这样做。