Allora, la logica è l'aritmetica binaria, come dovresti sapere, visto che l'implementazione, almeno un accenno, c'e' anche nel tuo sorgente originale.
Tenuto conto che questa è roba che ho studiato circa 20-30 anni fa, mi scuso per qualche imprecisione.
La variabile c contiene la somma del valore decimale dello stato delle lampadine, effettuando un AND logico con la rispettiva posizione binaria della lampadina ho un ritorno del suo stato.
Un semplice esempio:
le 8 lampadine rappresentano i BIT di un BYTE, "00000000" il range di valori è da 0 a 255.
10100000 in questo caso abbiamo acceso le lampadine 1 e 3 il cui valore da binario a decimale è 5 eseguendo una AND LOGICA su tutti i valori del byte ho come ritorno che solo le lampadine 1 e 3 sono accese
per meglio comprendere metto in verticale
1=1
0=2
1=4
0=8
0=16
0=32
0=64
0=128
la somma dei bit è 1+4 = 5
10100000 AND
10000000 =
10000000
dunque in forma decimale l'espessione
(5 and 1) = 1
10100000 AND
00100000 =
00100000
(5 and 4) = 4
tutti i restanti test mi daranno uno 0
10100000 AND
01000000 =
00000000
(5 and 2)=0
Come si nota il risultato della AND ritorna il valore testato da qui nasce l'implementazione:
d = (char)pow(2, h); // mi ritorna la posizione da testare
if ((c & d) == d) and logica che mi dice se il bit è acceso (true) o spento (false) in base al risultato mi comporto di conseguenza
poniamo c=7
11100000 (1+2+4)
le prime 3 lampadine sono accese, se spengo la 2 (01000000) avrò: 10100000 c=5.
e così via
Spero di essere stato chiaro,