Perché operazione bit a bit (~0);
stampe -1? In binario, non 0 dovrebbe essere 1. perché ?bit a bit non operatore
risposta
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:
- Two's complement
- Questo è il sistema usato da Java (tra gli altri) per rappresentare firmato valore numerico in bit
- JLS 15.15.5 Bitwise complement operator
~
- "di notare che, in tutti i casi,
~x
uguale(-x)-1
"
- "di notare che, in tutti i casi,
Perché ~
non è l'inversione binaria, è l'inversione per bit. L'inversione binaria sarebbe !
e può (in Java) essere applicata solo ai valori booleani.
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
E 'inversione di binario, e in seconda complemento -1 è l'inversione binaria 0.
Che in realtà si sta dicendo è ~ 0x00000000 e che si traduce in 0xFFFFFFFF. Per un (firmato) int in java, ciò significa -1.
~
è 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 = -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
+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 qui non è un po '. Si tratta di un byte (almeno; o più) - Uso 00000000. bitwise o dovremo 11111111. È -1 come intero con segno ...
Per 32 bit integer
~00000000000000000000000000000000=11111111111111111111111111111111
firmata (che è - 1)
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!
Altri esempi chiari, grazie! –
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.
- 1. ~ operatore bit a bit in JavaScript
- 2. Operatore bit a bit in SQLAlchemy
- 3. Java operatore bit a bit <<
- 4. Operatore bit a bit per ottenere byte da 32 bit
- 5. AND bit a bit in java con operatore "&"
- 6. Operazioni bit a bit su numeri non
- 7. Inversione bit tramite bit a bit
- 8. Python bit per bit AND su più numeri, più veloce di un operatore bit a bit iterativo?
- 9. Cross-over due interi bit a bit
- 10. Operazioni bit a bit a 48 bit in Javascript?
- 11. Precedenza dell'operatore (bit a bit '&' inferiore a '==')
- 12. perl AND bit a bit e bit spostando
- 13. Operazioni bit a bit in OCaml
- 14. Perché il cortocircuito bit a bit e l'operatore non funzionano?
- 15. risultato dell'operazione bit a bit e booleani
- 16. Operatori bit a bit e "endianness"
- 17. Istruzione condizionale con operatori bit a bit
- 18. Sostituire operazioni bit a bit in ESLint
- 19. Come generare un'espressione dinamica con un operatore ed enumerazione bit a bit?
- 20. Operazione bit a bit Java Vs BigInteger
- 21. l'esecuzione di una somma bit a bit
- 22. php array di bit a bit
- 23. AS3 spostamento bit a bit 0?
- 24. Spostamenti bit a bit logici e aritmetici
- 25. operatori booleani vs operatori bit a bit
- 26. Alcune domande sugli operatori bit a bit
- 27. Doctrine2 Querybuilder bit a bit e
- 28. Elenco Python per operazioni bit a bit
- 29. Bit bit shifting e scartare bit
- 30. profondità bit 16 bit
Se si desidera capovolgere un singolo bit, utilizzare 'x^1'. – kennytm
Non è un operatore "non". È un operatore "complementare". – EJP
@EJP: l'operatore di *** *** complementare. – kennytm