Джон Бентли в колонке 1 своего книжного жемчуга представляет собой метод сортировки последовательности ненулевых положительных целых чисел с использованием битовых векторов.Помогите мне понять эту программу «Программирование жемчуга».
Я принял программу bitsort.c из here и вставить его ниже:
/* Copyright (C) 1999 Lucent Technologies */
/* From 'Programming Pearls' by Jon Bentley */
/* bitsort.c -- bitmap sort from Column 1
* Sort distinct integers in the range [0..N-1]
*/
#include <stdio.h>
#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000
int a[1 + N/BITSPERWORD];
void set(int i)
{
int sh = i>>SHIFT;
a[i>>SHIFT] |= (1<<(i & MASK));
}
void clr(int i) { a[i>>SHIFT] &= ~(1<<(i & MASK)); }
int test(int i){ return a[i>>SHIFT] & (1<<(i & MASK)); }
int main()
{ int i;
for (i = 0; i < N; i++)
clr(i);
/*Replace above 2 lines with below 3 for word-parallel init
int top = 1 + N/BITSPERWORD;
for (i = 0; i < top; i++)
a[i] = 0;
*/
while (scanf("%d", &i) != EOF)
set(i);
for (i = 0; i < N; i++)
if (test(i))
printf("%d\n", i);
return 0;
}
Я понимаю, что функции CLR, установить и тест делают, и объяснить их ниже: (пожалуйста, поправьте меня, если я здесь неправильно).
- CLR очищает бит-ю
- набор устанавливает бит-ю
- тест возвращает значение в г-й бит
Теперь, я не понимаю, как функции делают то, что они делают , Я не могу понять все манипуляции с битами в этих трех функциях.
Пожалуйста, помогите.
Я принимаю ответ Лоуренса, как это помогло мне понять, о механике этой программы в фундаментальный уровень. – ardsrk