Domanda

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

È stato utile?

Soluzione

Vi sono in realtà abbastanza vicino.

  

In binario, non dovrebbe essere 0 1

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

Tuttavia, un int cui valore è 0 è in realtà 32 bit di tutti zeri! ~ inverte tutti i 32 zeri a 32 quelli.

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 senza segno int rappresentazione con complemento, ~1 == -2.


Per ulteriori approfondimenti:

Altri suggerimenti

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

Si potrebbe immaginare il primo bit in un numero con segno di essere - (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) è il seguente:

-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 nel troppo pieno 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!

~ è un operatore bit per 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

A causa ~ non è inversione di binario, è bit a bit inversione. Inversione binaria sarebbe ! e può (in Java) si applica esclusivamente ai valori booleani.

In codifica binaria di serie, 0 è tutti 0, ~ è NOT bit a bit. Tutti 1s è (più spesso) -1 per i tipi interi firmati. 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

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

0 qui non è un po '. Si tratta di un byte (almeno, o più) - 00000000. Utilizzando bit per bit o avremo 11111111. Si tratta di -1 come intero con segno ...

Per numero intero con segno a 32 bit

~00000000000000000000000000000000=11111111111111111111111111111111 (che è -1)

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

Javascript designa la tilde carattere, ~, per complemento a due, anche se nella maggior parte dei linguaggi di programmazione tilde rappresenta uno snodo bit per il complemento a uno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top