2010-03-25 18 views
34

Perché operazione bit a bit (~0); stampe -1? In binario, non 0 dovrebbe essere 1. perché ?bit a bit non operatore

+7

Se si desidera capovolgere un singolo bit, utilizzare 'x^1'. – kennytm

+1

Non è un operatore "non". È un operatore "complementare". – EJP

+1

@EJP: l'operatore di *** *** complementare. – kennytm

risposta

64

In realtà siete abbastanza vicini.

in binario, non dovrebbe essere 0 1

Sì, questo è assolutamente corretta quando si parla di un bit.

TUTTAVIA, un int il cui valore è 0 è in realtà 32 bit di tutti gli zeri! ~ inverte tutti i 32 zeri su 32.

System.out.println(Integer.toBinaryString(~0)); 
// prints "11111111111111111111111111111111" 

Questa è la rappresentazione complemento a due di -1.

Allo stesso modo:

System.out.println(Integer.toBinaryString(~1)); 
// prints "11111111111111111111111111111110" 

Cioè, per un 32 bit unsigned int nella rappresentazione in complemento a due, ~1 == -2.


Letture:

3

Perché ~ non è l'inversione binaria, è l'inversione per bit. L'inversione binaria sarebbe ! e può (in Java) essere applicata solo ai valori booleani.

1

Nella codifica binaria standard, 0 è tutti 0, ~ NON ha bit per bit. Tutti gli 1 è (più spesso) -1 per i tipi di interi con segno. Così, per un tipo di byte con segno:

0xFF = -1 // 1111 1111 
0xFE = -2 // 1111 1110 
... 
0xF0 = -128 // 1000 0000 
0x7F = 127 // 0111 1111 
0x7E = 126 // 0111 1110 
... 
0x01 = 1  // 0000 0001 
0x00 = 0  // 0000 0000 
0

E 'inversione di binario, e in seconda complemento -1 è l'inversione binaria 0.

13

Che in realtà si sta dicendo è ~ 0x00000000 e che si traduce in 0xFFFFFFFF. Per un (firmato) int in java, ciò significa -1.

7

~ è un operatore bit a bit.

~0 = 1 which is -1 in 2's complement form 

http://en.wikipedia.org/wiki/Two's_complement

Alcuni numeri in forma di complemento a due e la loro bit-saggio non ~ (appena al di sotto di loro):

0 1 1 1 1 1 1 1 = 127
1 0 0 0 0 0 0 0 = -128

0 1 1 1 1 1 1 0 = 126
1 0 0 0 0 0 0 1 = -127

1 1 1 1 1 1 1 1 = -1
0 0 0 0 0 0 0 0 = 0

1 1 1 1 1 1 1 0 = -2
0 0 0 0 0 0 0 1 = 1

1 0 0 0 0 0 0 1 = -127
0 1 1 1 1 1 1 0 = 126

1 0 0 0 0 0 0 0 = -128
0 1 1 1 1 1 1 1 = 127

+0

+1 per l'esempio chiaro. I programmatori che amano il puzzle possono scoprire sia come funziona che come funziona il complemento a due solo studiando attentamente il tuo esempio! –

0

0 qui non è un po '. Si tratta di un byte (almeno; o più) - Uso 00000000. bitwise o dovremo 11111111. È -1 come intero con segno ...

0

Per 32 bit integer

~00000000000000000000000000000000=11111111111111111111111111111111 firmata (che è - 1)

9

Si potrebbe immaginare che il primo bit in un numero firmato sia - (2 x -1) dove x è il numero di bit.

Quindi, dato un numero a 8 bit, il valore di ogni bit (in ordine da sinistra a destra) è:

-128 64 32 16 8 4 2 1 

Ora, in binario, 0 è ovviamente tutti 0:

-128 64 32 16 8 4 2 1 
0  0 0 0 0 0 0 0 0 = 0 

E quando lo fai il bit non ~ ciascuno di questi 0s diventa un 1:

 -128 64 32 16 8 4 2 1 
~0  1 1 1 1 1 1 1 1 
= -128+64+32+16+8+4+2+1 == -1 

Questo è anche utile i n overflow di comprensione:

 -128 64 32 16 8 4 2 1 
126  0 1 1 1 1 1 1 0 = 126 
+1  0 1 1 1 1 1 1 1 = 127 
+1  1 0 0 0 0 0 0 0 = -128 overflow! 
+0

Altri esempi chiari, grazie! –

0

Penso che la vera ragione è che ~ è complemento a due.

Javascript indica il carattere tilde, ~, per il complemento a due, anche se nella maggior parte dei linguaggi di programmazione tilde rappresenta un po 'di commutazione per il complemento.