Bit Mask use no programa abaixo em Programming Pearls

Comecei a ler "Programming Pearls" hoje e, enquanto fazia seu exercício, me deparei com esta pergunta "Como você implementaria seu próprio vetor de bits?". Quando olhei para a solução, era assim:

#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)); 

Onde estou me confundindo é esta afirmação

 1 << (i & MASK)

Alguém poderia me explicar o que está acontecendo aqui?

questionAnswers(2)

yourAnswerToTheQuestion