2012-04-01 3 views
1

Я читаю код, где предполагается реализовать бит вектор, используя массив byte.
Идея состоит в том, что битвектор имеет бит, если число находится в соответствующей позиции.
E.g. если номер 10 присутствует, бит 10 должен быть установлен и т. д. Это классическая концепция, и я получаю ее, но я не уверен в реальной реализации.Бит вектор построить на байт-массив - понимание бит манипуляции

Часть я не получаю:
bitvector [num/8] |= 1 << (num % 8);

Где num это число, чтобы установить.
Если num равно 10, тогда должен использоваться второй байт (num/8 ok), но 1 << (num % 8) не устанавливает второй бит второго байта, как должен. Имеет ли это?

+3

Почему вы не печатаете '1 << (num% 8)' и узнаете? –

+0

@OliCharlesworth: Теперь я чувствую себя идиотом. Я слишком потреблял, думая, что это неправильно, чтобы попробовать это – Cratylus

ответ

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' so 6 – Cratylus

+0

' << '- операция с небольшим сдвигом. 1 << 2 - 4 (т. Е. 2-й бит). –

+0

Собственно, это * третий * бит. –

1

Вы почти правы: этот код устанавливает третий бит второго байта. 10/8 == 1, и 10%8 == 2. Все отключено на единицу, поэтому 10 означает «бит номер одиннадцать», 1 означает «второй байт», поэтому установка третьего бита второго байта верна для аргумента 10.

+0

Я вижу сейчас. Я думал, что это 10-й бит, фактический 10, когда вы стучите слева направо. Первые 8 бит, а во втором байте десятая - слева. Но это наоборот. – Cratylus

1

Это значит, если «первый бит - это наименее значимый бит. Это правильный способ его определения. Я предполагаю, что вы думаете, что первый бит является самым значительным битом, и в этом случае вам нужно сдвинуть на (7 - (num % 8)). Вы могли бы так и сделать.

Смежные вопросы