Puoi mettere insieme i bit per tenere traccia di qualsiasi numero di valori di stato di cui hai bisogno.
Se è necessario tenere traccia dei 4 valori di stato, utilizzare 2 bit.
Ogni bit ti dà 2 valori. 2 bit ti danno 2x2.
Non sono sicuro del motivo per cui sono stati raggruppati operatori di array e% come se fossero la stessa categoria di operazioni. % è un operatore di modulo. Non ritengo che l'operatore sia lento.
Ovviamente l'impilamento di bit può generare espressioni che possono sembrare complesse, ma qual è la priorità? È leggibilità o prestazioni? Vuoi essere efficiente nell'uso dello spazio per archiviare i tuoi dati?
Per utilizzare i dati organizzati come elementi a 2 bit, l'array 4-int che hai ottenuto sarà sostituito da un solo int.
Sulla maggior parte dei sistemi int saranno almeno 2 byte - quindi è più che sufficiente per contenere 4 valori a 2 bit (o "semafori" come dici tu.)
Faresti bene a confermare quale sia la dimensione di int sul tuo sistema.
E puoi provare questo codice:
int a = 0b10000000; // 4x2 bit value equivalent to: new int[4]{0,0,0,2};
int b = 0b00000011; // first item value is 3
size_data = 4;
for (int i=0; i < size_data; i++) {
// expression: i*2 gives index for shr
// a >> i*2 & 0x03 gives the value of a
// b >> i*2 & 0x03 gives the value of b
printf("i=%d i*2=%d a=%d b=%d\n", i*2, a >> i*2 & 0x03, b >> i*2 & 0x03);
}