Ho iniziato a leggere "Programming Pearls" oggi e mentre facevo esercizio mi sono imbattuto in questa domanda "Come implementeresti il tuo vettore bit?". Quando ho guardato la soluzione era così:Bit Utilizzo maschera nel programma di programmazione da Perle
#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));
Dove mi sto confuso in questa affermazione
1 << (i & MASK)
Qualcuno potrebbe spiegare che cosa sta succedendo qui?
Grazie per la risposta Henning. Sarebbe valido se sostituissi '(i & MASK)' con '(i% 32)'? Se sarà valido ma non elegante, potresti per favore chiarire perché 'i & MASK' è preferito su' i% 32'? Molte grazie. – test123
Sì - "i & MASK" e "i% 32" sono la stessa cosa se si è sicuri che "i" non è negativo. L'AND bit a bit è in genere più efficiente di una divisione con resto e pertanto è diventato la scelta tradizionale. O almeno per essere più efficiente quando i compilatori erano stupidi. Oggi puoi aspettarti che anche un compilatore moderatamente ottimizzante riscriva 'i% 32' su' i & 31' internamente in questo contesto (o può provare che 'i' non è negativo, nel qual caso la riscrittura è sempre sicura, oppure può pensare che un risultato negativo possa innescare comunque un comportamento indefinito nello spostamento). –
Grande. Grazie mille per la spiegazione. – test123