Я изучаю вопрос в книге Programming Pearls, и они рекомендовали эту функцию, чтобы установить бит в битовом векторе. Я немного смущен тем, что он делает.
#define BITSPERWORD 32
#define MASK 0x1F
#define SHIFT 5
#define N 1000000
int a[1 + N/BITSPERWORD];
void set(int i){
a[i >> SHIFT] |= (1 << (i & MASK));
}
Вот моя (вероятно неправильная) интерпретация этого кода. если я = 64,
1) сначала он берет i
и сдвигает его вправо на SHIFT (то есть 5) бит. Это эквивалентно ДЕЛЕНИЮ (а не умножению, как я сначала подумал) i
на 2^5
. Итак, если i
равно 64
, индекс a равен 2
(64 / 2^5)
2) a[2] |= (1 << (64 & MASK))
64 & 1 = 1000000 & 01 = 1000001
.
Итак, 1 сдвигается влево на сколько бит????