bitwise non Operatore
-
22-09-2019 - |
Domanda
Perché bit per bit stampe operazione (~0);
-1? In binario, non dovrebbe essere 0 1. perché?
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:
- complemento a due
- Questo è il sistema usato da Java (tra gli altri) per rappresentare firmato valore numerico in bit
operatore - JLS 15.15.5 complemento bit a bit
- "notare che, in tutti i casi, è uguale a
~x
(-x)-1
"
- "notare che, in tutti i casi, è uguale a
~
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 = -1280 1 1 1 1 1 1 0 = 126
1 0 0 0 0 0 0 1 = -1271 1 1 1 1 1 1 1 = -1
0 0 0 0 0 0 0 0 = 01 1 1 1 1 1 1 0 = -2
0 0 0 0 0 0 0 1 = 11 0 0 0 0 0 0 1 = -127
0 1 1 1 1 1 1 0 = 1261 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.