2011-01-21 9 views
26

Comprendo che il singolo operatore e commerciale viene normalmente utilizzato per un'operazione AND bit a bit. Tuttavia, qualcuno può aiutare a spiegare i risultati interessanti che si ottengono quando lo si utilizza per il confronto tra due numeri?Comprensione del comportamento di un singolo operatore e commerciale (&) sui numeri interi

Ad esempio;

(6 & 2) = 2 
(10 & 5) = 0 
(20 & 25) = 16 
(123 & 20) = 16 

Non sembra esserci alcun collegamento logico tra questi risultati: mi manca qualcosa? La documentazione online sembra solo riferirsi al confronto di booleani o bit singoli.

+1

Sei sicuro (20 & 25) == 4? – Nick

+1

@Nick Ho capito. –

+1

Quello che stai vedendo * è * il risultato di un'operazione "AND bit a bit". (Tranne il bit '(20 & 25) = 4', che presumo sia un errore di battitura.) – LukeH

risposta

46

Confronta le rappresentazioni binarie di ognuno di questi.

110 &  010 =  010 
    1010 & 0101 = 0000 
    10100 & 11001 = 10000 
1111011 & 0010100 = 0010000 

In ogni caso, una cifra è 1 nel risultato solo quando è 1 sia sul lato sinistro e destro dell'ingresso.

+0

+1: Wow, tutte le operazioni in così poco tempo! – Rekin

+6

@Rekin: Per numeri piccoli come questi posso convertire tra decimali, esadecimali e binari nella mia testa, praticamente. Ho anche trovato un angolo dove inserire la maggior parte del tavolo ASCII. –

+1

@Jefrrey, solo per curiosità: lavori in un ambiente di basso livello? Tale tipo di software, come ad esempio protocollo, messaggistica o prestazioni? – Rekin

6

è necessario convertire i vostri numeri di rappresentazione binaria e poi si vedrà il legame tra risultati come 6 & 2 = 2 è in realtà 110 & 010 = 010 ecc 5 è 1010 & 0101 = 0000

4

Il binario e l'operazione vengono eseguiti sugli interi, rappresentati in binario. Per esempio

110 (6) 
010 (2) 
-------- 
010 (2) 
2
6  = 0110 
2  = 0010 
6 & 2 = 0010 

20  = 10100 
25  = 11001 
20 & 25 = 10000 

(sembra che stai calcolo è sbagliato per questo)

Etc ...

2

Internamente, interi sono memorizzati in binary format. Vi consiglio caldamente di leggere su questo. Conoscere la rappresentazione bitwise dei numeri è molto importante.

Detto questo, il confronto bit per bit confronta i bit dei parametri:

Decimal: 6 & 2 = 2 
Binary: 0110 & 0010 = 0010 
0

Bitwize e partite i bit in notazione binaria uno per uno e il risultato è il bit che sono comOn tra i due numeri.

Per convertire un numero in binario è necessario comprendere il sistema binario.

Ad esempio 6 = 110 binario

La 110 rappresenta 1x4 + 1x2 + 0x1 = 6.

2 è quindi 0x4 + 1x2 + 0x1 = 2.

Bitwize e conserva solo le posizioni in cui entrambi i numeri hanno la posizione impostata, in questo caso il bit per 2 e il risultato è quindi 2.

Ogni bit in più è il doppio dell'ultimo quindi un numero a 4 bit utilizza i moltiplicatori 8, 4, 2, 1 e può t in questo caso rappresentano tutti i numeri da 0 a 15 (la somma dei moltiplicatori).

2

L'AND bit a bit fa esattamente questo: esegue un'operazione AND sui bit.

Quindi per anticipare il risultato è necessario guardare i bit, non i numeri.

e ti dà 1, solo se c'è 1 sia il numero nella stessa posizione:

6(110) & 2(010) = 2(010) 
10(1010) & 5(0101) = 0(0000) 

Un OR bit a bit vi darà 1 se c'è 1 in entrambi i numeri nella stessa posizione:

6(110) | 2(010) = 6(110) 
10(1010) | 5(0101) = 15(1111) 
Problemi correlati