Supponiamo che io abbia una mano di 8 carte:
7 8 9 10 J Q K A
Come possiamo invertirli? Un modo è quello di scambiare coppie adiacenti:
8 7 10 9 Q J A K
gruppi Poi, casse mobili adiacenti di 2: scambio 8 7 e 10 9, ecc:
10 9 8 7 A K Q J
Infine, gruppi di scambio di quattro, che è metà misura 8:
A K Q J 10 9 8 7
Fatto.
È possibile farlo in diversi ordini. Perché? Perché gli scambi sono stabili l'uno rispetto all'altro. Quando scambiamo la metà superiore delle carte con la metà inferiore, ad esempio, le coppie rimangono nello stesso ordine. O quando scambiamo le coppie, le metà rimangono nello stesso ordine.
Questo è ciò che il codice sta facendo con le operazioni di bit. Ad esempio per scambiare coppie possiamo utilizzare la maschera 01010101 per scegliere i bit pari e 10101010 di individuare i bit dispari, utilizzando il bit operazione AND:
ABCDEFGH ABCDEFGH
& 01010101 & 10101010
---------- ----------
= 0B0D0F0H A0C0E0G0
Ricordare, la regola per ed è che dato un certo valore bit X, X & 1 = X e X & 0 = 0. I 1 bit nella maschera mantengono il valore e i 0 bit nella maschera producono 0. Si chiama mascheramento perché assomiglia esattamente a una maschera utilizzata in spray - pittura, ecc. I 1 bit "coprono" i luoghi che non vuoi "verniciare" con zero.
Successivamente, il risultato a sinistra viene spostato a sinistra di un bit e il risultato a destra viene spostato a destra.Ciò comporta lo scambio:
B0D0F0H0 0A0C0E0G
Finalmente, i due sono combinati con OR logico. La regola per OR è che X o 0 è X. Le due parti hanno ciascuna 0 dove l'altro ha zero, e quindi i bit semplicemente unire:
B0D0F0H0
| 0A0C0E0G
----------
= BADCFEHG
E ora le coppie vengono scambiati.
Swap, i quarti di swap, otto swap ... –
@pst si prega di spiegare ulteriormente – Eight
Perché non si lavora fuori con carta e matita? Usa un numero a 8 bit e vai solo a 0x0F/0xF0. – Kaz