Bit Mask uso en el programa a continuación de Programming Pearls

Empecé a leer "Programming Pearls" hoy y mientras hacía su ejercicio me encontré con esta pregunta "¿Cómo implementaría su propio vector de bits?". Cuando miré la solución fue así:

#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000

int a[1 + N/BITSPERWORD]; 

void set(int i) { a[i >> SHIFT] |= (1 << (i & MASK)); 

Donde me estoy confundiendo es esta declaración

 1 << (i & MASK)

¿Podría alguien explicarme qué está pasando aquí?

Respuestas a la pregunta(2)

Su respuesta a la pregunta