[C++] Scambio di numeri con bitwise

Messaggioda ZfreS » 03/08/2019, 10:51

Nel libro da cui studio c'è un esempio di utilizzo dell'operatore bitwise xor. Dati due interi x1 e x2 per scambiarli bisogna effettuare queste operazioni:
Codice:
x1 = x1^x2
x2=x1^x2
x1=x1^x2


Potreste spiegarmi come funziona? Perchè facendo queste operazioni ottengo i numeri scambiati?
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1787 di 4589
Iscritto il: 22/10/2016, 17:52

Re: [C++] Scambio di numeri con bitwise

Messaggioda Super Squirrel » 03/08/2019, 13:22

Dalla tabella di verità dello XOR

A B | C
0 0 | 0
1 0 | 1
0 1 | 1
1 1 | 0

si evince che

$C=Ao+BrArr{(Co+A=B),(Co+B=A):}$

Quindi ponendo
Codice:
x1 = A
x2 = B
C = A ^ B

le ultime due equazioni da te scritte diventano
Codice:
x2 = C ^ B = A
x1 = C ^ A = B
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 371 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] Scambio di numeri con bitwise

Messaggioda ZfreS » 03/08/2019, 14:08

Ma perhè possiamo dedurre questo?
$C=Ao+BrArr{(Co+A=B),(Co+B=A):}$
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1788 di 4589
Iscritto il: 22/10/2016, 17:52

Re: [C++] Scambio di numeri con bitwise

Messaggioda Super Squirrel » 03/08/2019, 14:51

Dalla tabella di verità, che ricopre tutti i casi possibili, puoi facilmente verificare che quell'implicazione è sempre vera.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 372 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] Scambio di numeri con bitwise

Messaggioda ZfreS » 03/08/2019, 15:33

Ok. Ora devo capire come fa a scambiare i numeri. Prendiamo per esempio $a=3$ $b=5$ che in binario sono $a=0011$ e $b=0101$. La prima istruzione è $a = a^b$ ovvero $a = 0011^0101$ $a=0110=6$. La seconda istruzione è: $b = a^b$ ovvero $b = 0110^0101$ $b=0011=3$ e infine la terza istruzione è: $a = a^b$ ovvero
$a = 0110^0011$ $a = 0101=5$. I numeri effettivamente risultano scambiati, ma non capisco come mai facendo proprio lo xor con queste istruzioni si ottiene il risultato. Cosa avviene a livello dei bit?
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1789 di 4589
Iscritto il: 22/10/2016, 17:52

Re: [C++] Scambio di numeri con bitwise

Messaggioda Super Squirrel » 03/08/2019, 18:37

Non sono sicuro di aver capito bene la domanda, ad ogni modo quanto detto in precedenza, se vale per 2 singoli bit, varrà anche per 2 sequenze di bit (che nel caso specifico rappresentano 2 variabili intere).
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 373 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] Scambio di numeri con bitwise

Messaggioda vict85 » 03/08/2019, 19:03

Non usare il simbolo ^ in mathjax o non si capisce nulla. Se vuoi usare un simbolo simile in mathjax dovresti scrivere \(\wedge\) (\wedge), ma lo sconsiglio perché quel simbolo è usato in matematica per indicare la congiunzione logica. Wiki sembra suggerire un specie di \(\vee\) con un puntino sopra. Ma nella lista mette anche \(\veebar\) (\veebar) e \(\oplus\) (\oplus) che sono presenti nella lista dei Simboli Latex supportati dal sito.

La prima cosa che devi considerare è che lo xor viene fatto bit a bit e che quindi ti basta che lo scambio funzioni per un singolo bit. Se lo fa funzionerà automaticamente per ogni "array di bit".

E' abbastanza semplice verificare che lo xor gode della proprietà commutativa e associativa. Inoltre ha la proprietà che \(a \oplus a = \mathbf{0}\) per ogni \(a\in \mathbb{Z}_2^{32}\) e che \(a \oplus \mathbf{0} = a\).

Venendo al tuo problema. Vuoi dimostrare le seguenti due cose:
  1. \(a \oplus b \oplus a = b\) . Questo si dimostra così:
    \[ a\oplus b\oplus a = a\oplus a\oplus b = \mathbf{0}\oplus b = b\]
  2. \(a \oplus b \oplus b = a\) si dimostra in modo simile.
vict85
Moderatore
Moderatore
 
Messaggio: 9778 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C++] Scambio di numeri con bitwise

Messaggioda ZfreS » 04/08/2019, 10:49

Perfetto vict, grazie mille per la spiegazione!
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1790 di 4589
Iscritto il: 22/10/2016, 17:52

Re: [C++] Scambio di numeri con bitwise

Messaggioda vict85 » 04/08/2019, 14:06

Un piccolo consiglio informatico: impara quella cosa e poi dimenticala. Il compilatore applicherà l'ottimizzazione da solo il più delle volte e, come avrai notato, non è la successione di istruzioni più leggibile che esista.
vict85
Moderatore
Moderatore
 
Messaggio: 9781 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C++] Scambio di numeri con bitwise

Messaggioda ZfreS » 04/08/2019, 14:56

Ho capito, grazie per il consiglio!
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 1791 di 4589
Iscritto il: 22/10/2016, 17:52


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite