2012-04-01 97 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))。你也可以這樣做。