Vorrei xor tutti i numeri e xor quello con quello che avrebbe dovuto essere lo xor della lista completa. (Che xor dipende da N e non è difficile da capire.)
Funziona perché xor ha le seguenti proprietà:
- commutativo:
a xor b = b xor a
- associative:
(a xor b) xor c = a xor (b xor c)
- 0 è l'identità:
a xor 0 = a
- auto-annullamento: 'a xor a = 0
Ancora meglio, lo fa senza mai cambiare quanti bit hai nella tua rappresentazione. E xor sembra essere una delle operazioni più veloci in un computer.
Quindi il risultato di questo calcolo è lo stesso che otterresti se abbiassi ciascun numero nell'elenco con una copia di se stesso, li facessi xori tutti insieme, quindi il numero extra inserito da mistke. Ma questo si trasforma in 0 xored con se stesso un sacco di volte poi xored con il numero extra. Che diventa tutto solo il numero in più.