Нам даны числа, которые будут лежать в диапазоне от 0 до N
,
Итак, мы делаем большой BitSet
, который необходим для большого логического массива (работа объяснена в конце), нозанимает меньше памяти (каждый бит технически является логическим)
Итак, что делает Джон, он устанавливает весь бит на false
, затем для каждого встреченного числа он устанавливает этот бит на true ...он пробегает набор битов и для каждой записи true
печатает индекс.Это позволит отсортировать массив, где мы знаем, что элемент всегда лежит между 0 to N
.
Примечание. Вышеприведенный алгоритм завершится ошибкой с дубликатами.
Теперь для материала с битовой маской ...
Скажем, у меня есть целочисленный массив (sizeof (int) = 32), но я хочу использовать его как логический массив размера N.Так сколько элементов мне действительно нужно?Это N/32
int a[1 + N/BITSPERWORD]; // allocates BitSet of N size
Теперь, если я хочу получить доступ к ith
элементу BitSet, вот как работает индексация.
Например, i = 49
, такa[0]
содержит биты 0-31, a [1] содержит 32-63.
a[i/32]
(показывает, какой элемент int array содержит бит) и i % 32
битположение в этом элементе.
, поэтому для i= 49
, a[49/32] & ( 1 << (i % 32) )
сообщит вам, установлен ли 49-й бит или нет.
Если вы знакомы с побитовой оптимизацией, вы знаете, что делениев 2 раза означает смещение числа вправо на число факторов.
32 = 2 ^ 5 ... поэтому X/32
тоже самое, что X >> 5
также X % 32
то же самое, что и X & 0x1f
test
функция выдает 1, если набор битов в позиции установлен,
clr
очищает набор битов в этой позиции в ноль
set
устанавливает битовый набор в позиции на единицу.
Фу!Надеюсь, это поможет.