Jon Bentley en la Columna 1 de sus perlas de programación de libros introduce una técnica para clasificar una secuencia de enteros positivos distintos de cero utilizando vectores de bits.Ayúdeme a entender este programa "bits perlas de programación"
yo he tomado el programa bitsort.c de here y pegado a continuación:
/* 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;
}
entiendo lo que el CLR funciones, ajuste y prueba están haciendo y las explican a continuación: (por favor, corríjanme si estoy mal aquí).
- CLR borra el bit i
- conjunto establece el bit i
- prueba devuelve el valor en el bit i
Ahora, yo no entiendo como lo hacen las funciones de lo que hacen . No puedo entender toda la manipulación de bit que ocurre en esas tres funciones.
Por favor ayuda.
voy a aceptar la respuesta de Laurence ya que me ayudó a entender acerca de la mecánica del programa en una nivel fundamental – ardsrk