Битовая магия используется в качестве специальной схемы адресации, которая хорошо работает с размерами строк, равными двум.
Если вы попытаетесь понять это (примечание: я предпочитаю использовать биты на строку, а не биты на слово, поскольку здесь речь идет о битовой матрице):
// supposing an int of 1 bit would exist...
int1 bits[BITSPERROW * N]; // an array of N x BITSPERROW elements
// set bit at x,y:
int linear_address = y*BITSPERWORD + x;
bits + linear_address = 1; // or 0
// 0 1 2 3 4 5 6 7 8 9 10 11 ... 31
// . . . . . . . . . . . . .
// . . . . X . . . . . . . . -> x = 4, y = 1 => i = (1*32 + 4)
Заявление linear_address = y*BITSPERWORD + x
также означает, что x = linear_address % BITSPERWORD
и y = linear_address / BITSPERWORD
.
Когда вы оптимизируете это в памяти, используя 1 слово из 32 битов на строку, вы получите тот факт, что бит в столбце x может быть установлен с помощью
int bitrow = 0;
bitrow |= 1 << (x);
Теперь, когда мы перебираем биты, у нас есть линейный адрес, но нам нужно найти соответствующее слово.
int column = linear_address % BITSPERROW;
int bit_mask = 1 << column; // meaning for the xth column,
// you take 1 and shift that bit x times
int row = linear_address / BITSPERROW;
Итак, чтобы установить i-й бит, вы можете сделать это:
bits[ i%BITSPERROW ] |= 1 << (linear_address / BITSPERROW );
Еще один важный момент: оператор по модулю может быть заменен логическим И, а оператор / также может быть заменен смещением, если второй операнд имеет степень двойки.
a % BITSPERROW == a & ( BITSPERROW - 1 ) == a & MASK
a / BITSPERROW == a >> ( log2(BITSPERROW) ) == a & SHIFT
Это, в конечном счете, сводится к очень плотной, но трудной для понимания биткой лексике
a[ i >> SHIFT ] |= ( 1 << (i&MASK) );
Но я не вижу, чтобы алгоритм работал, например, 40 бит на слово.