Ciao,
La spegni bit che hai implementato è errata... se effettui un'operazione di xor (^) non ottieni il risultato sperato...
per i bit a zero nella maschera avrai il risultato voluto (il bit originario rimane zero o uno), ma per il bit ad uno avrai che:
1) Se era 0, viene impostato... ossia diventa 1
2) Se era 1, viene azzerato, ossia produce il risultato voluto
Il codice che hai proposto, pertanto si comporta bene solo se il bit corrispondente a quello impostato nella maschera
non è zero, altrimenti ottieni di "accenderlo".
In sostanza, per fare un esempio:
0011 ^ 0001 = 0010 (corretto)
Ma:
0010 ^ 0001 = 0011 (errato, secondo quello che volevi ottenere)
L'unico sistema "veloce" per resettare un bit è l' and con il not della maschera... in alternativa si può impostare la maschera a 0xFFFFFFFE e spostare quella, ma non con la normale operazione di shift <<, che introduce zeri a destra... si dovrebbe ricorrere ad una ror (mi pare che esista nella libreria standard, ma non è una funzione molto usata, visto che alla fine è comunque più veloce un & e ~)
Ciaociao