Credo che quel "-" sia proprio il complemento a due...usando la formula del tuo #define, cioè
toData ^= (-bitValue ^ toData) & (1 << nbit)
e ponendo per esempio
toData = B01010101
nbit = 4
Ottengo, usando bitValue = 0 (quindi voglio settare a 0 il quarto bit della variabile) :
(-00000000 ^ 01010101) & 00010000 = (00000000 ^ 01010101) & 00010000 = 01010101 & 00010000 = 00010000 => toData = toData ^ 00010000 = 01010101 ^ 00010000 = 01000101
Riapplico la formula sul nuovo valore di toData, usando questa volta bitValue = 1 (dovrei riottenere il valore originale)
(-00000001 ^ 01000101) & 00010000 = (11111111 ^ 01000101) & 00010000 = 10111010 & 00010000 = 00010000 => toData = 01000101 ^ 00010000 = 01010101
Nemmeno io riesco ad afferrare la logica che c'è dietro però, è mezz'ora che cerco di capire come funziona