Immagina di avere due numeri binari: a
e b
. E diciamo che questi numeri non hanno mai 1 nello stesso bit allo stesso tempo, cioè se a
ha 1 in qualche bit, lo b
ha sempre 0 nel bit corrispondente. E in un'altra direzione, se b
ha 1 in qualche bit, quindi a
ha sempre 0 in quel bit. Ad esempio
a = 00100011
b = 11000100
Questo sarebbe un esempio di a
e b
soddisfano la condizione di cui sopra. In questo caso è facile vedere che a | b
sarebbe esattamente lo stesso di a + b
.
a | b = 11100111
a + b = 11100111
Vediamo ora due numeri che violano la nostra condizione, vale a dire due numeri hanno almeno un 1 in qualche po 'comune
a = 00100111
b = 11000100
È a | b
lo stesso di a + b
in questo caso? No
a | b = 11100111
a + b = 11101011
Perché sono diversi? Sono diversi perché quando abbiamo +
il bit che ha 1 in entrambi i numeri, produciamo il cosiddetto trasportare: il bit risultante è 0 e 1 viene portato al bit successivo a sinistra: 1 + 1 = 10
. Funzionamento |
ha alcun riporto, quindi 1 | 1
è ancora solo 1.
Ciò significa che la differenza tra a | b
e a + b
verifica quando e solo quando i numeri hanno almeno un 1 nel bit comune. Quando sommiamo due numeri con 1 in bit comuni, questi bit comuni vengono aggiunti "due volte" e producono un carry, che rovina la similarità tra a | b
e a + b
.
Ora guardare a & b
. Che cosa calcola a & b
? a & b
produce il numero che ha 1 in tutti i bit in cui sia a
che b
hanno 1.Nel nostro ultimo esempio
a = 00100111
b = 11000100
a & b = 00000100
Come si è visto in precedenza, questi sono esattamente i bit che compongono a + b
differiscono da a | b
. Il numero 1 in a & b
indica tutte le posizioni in cui si verificherà il trasporto.
Ora, quando facciamo a - (a & b)
abbiamo effettivamente rimuovere (sottrazione) tutti "offendere" bit di a
e solo quei bit
a - (a & b) = 00100011
Numeri a - (a & b)
e b
hanno alcun incontrate 1 bit, il che significa che se aggiungiamo a - (a & b)
e b
noi non incorrere in un carry, e, se ci pensate bene, dovremmo finire con lo stesso risultato come se abbiamo appena fatto a | b
a - (a & b) + b = 11100111
"Tutti i numeri binari mi veniva in mente" - Beut :) Nizza capitano domanda. –
Perché Oracle ha un 'BITAND()' ma non 'BITOR()'? – Thanatos