Come funziona l’operatore del complemento bit per bit (~ tilde)?

Perché ~ 2 è uguale a -3? Come funziona l’operatore ~ ?

Ricorda che i numeri negativi sono memorizzati come complemento a due della controparte positiva. Ad esempio, ecco la rappresentazione di -2 in complemento a due: (8 bit)

 1111 1110 

Il modo in cui ottieni questo è prendendo la rappresentazione binaria di un numero, prendendo il suo complemento (invertendo tutti i bit) e aggiungendone uno. Due inizia come 0000 0010, e invertendo i bit otteniamo 1111 1101. Aggiungendone uno otteniamo il risultato sopra. Il primo bit è il bit del segno, che implica un negativo.

Diamo un’occhiata a come otteniamo ~ 2 = -3:

Ecco di nuovo due:

 0000 0010 

Basta capovolgere tutti i bit e otteniamo:

 1111 1101 

Bene, che aspetto ha -3 nel complemento a due? Inizia con positivo 3: 0000 0011, ruota tutti i bit su 1111 1100 e aggiungi uno a valore negativo (-3), 1111 1101.

Quindi, se si invertono semplicemente i bit in 2, si ottiene la rappresentazione del complemento a due di -3.

L’operatore complementare (~) JUST FLIPS BITS. Spetta alla macchina interpretare questi bit.

~ ribalta i bit nel valore.

Perché ~2 è -3 ha a che fare con il modo in cui i numeri sono rappresentati a bit. I numeri sono rappresentati come complementi a due .

Quindi, 2 è il valore binario

 00000010 

E ~ 2 capta i bit in modo che il valore sia ora:

 11111101 

Quale, è la rappresentazione binaria di -3.

Come altri hanno menzionato ~ bit appena capovolti (cambia uno a zero e zero a uno) e dal momento che viene utilizzato il complemento a due, ottieni il risultato che hai visto.

Una cosa da aggiungere è perché viene utilizzato il complemento a due, in modo che le operazioni sui numeri negativi siano le stesse dei numeri positivi. Pensa a -3 come il numero a cui bisogna aggiungere 3 per ottenere lo zero e vedrai che questo numero è 1101 , ricorda che l’aggiunta binaria è come l’aggiunta della scuola elementare (decimale) solo se ne porti una quando arrivi a due anziché 10.

  1101 + 0011 // 3 = 10000 = 0000 // lose carry bit because integers have a constant number of bits. 

Quindi 1101 è -3 , capovolgi i bit che ottieni 0010 che è due.

Questa operazione è un complemento, non una negazione.

Considera che ~ 0 = -1, e lavora da lì.

L’algoritmo per la negazione è “complementare, incrementare”.

Lo sapevate? C’è anche il “complemento di uno” in cui i numeri inversi sono simmetrici e ha sia uno 0 sia un -0.

int a = 4; System.out.println (~ a); Il risultato sarebbe: -5

‘~’ di qualsiasi intero in java rappresenta il complemento 1 del n. per esempio sto prendendo ~ 4, che significa in rappresentazione binaria 0100. prima, la lunghezza di un intero è di quattro byte, cioè 4 * 8 (8 bit per 1 byte) = 32. Quindi nella memoria di sistema 4 è rappresentato come 0000 0000 0000 0000 0000 0000 0000 0100 ora l’operatore eseguirà il complemento 1 sul binario sopra non

cioè 1111 1111 1111 1111 1111 1111 1111 1011-> 1 complementare il bit più significativo rappresenta il segno del no (o – o +) se è 1 allora il segno è ‘-‘ se è 0 allora il segno è ‘+’ come da questo il nostro risultato è un numero negativo, in java i numeri negativi sono memorizzati nella forma del complemento a 2, il risultato acquisito che dobbiamo convertire in complemento a 2 (prima compie il complemento 1 e aggiungi solo il complemento 1 a 1). tutto ciò diventerà zeri, tranne il bit più significativo 1 (che è la nostra rappresentazione del segno del numero, che significa per 31 bit rimanenti 1111 1111 1111 1111 1111 1111 1111 1011 (risultato acquisito dall’operatore ~) 1000 0000 0000 0000 0000 0000 0000 0100 (complemento 1)

1 (complemento a 2)

1000 0000 0000 0000 0000 0000 0000 0101 ora il risultato è -5 controlla questo link per il video < [Operatori bit wise in java] https://youtu.be/w4pJ4cGWe9Y

So che la risposta a questa domanda è postata molto tempo fa, ma volevo condividere la mia risposta per lo stesso.

Per trovare il complemento di un numero, per prima cosa trova il suo equivalente binario. Qui, il numero decimale 2 è rappresentato come 0000 0010 in forma binaria. Ora prendendo il suo complemento invertendo (girando tutti gli 1 in 0 e tutti gli 0 in 1) tutte le cifre della sua rappresentazione binaria, che si tradurranno in:

 0000 0010 → 1111 1101 

Questo è il complemento del numero decimale 2. E poiché il primo bit, cioè il bit del segno è 1 nel numero binario, significa che il segno è negativo per il numero memorizzato. (qui, il numero indicato non è 2 ma il complemento di 2).

Ora, dato che i numeri sono memorizzati come complemento a 2 (prendendo il complemento di un numero più uno), così per visualizzare questo numero binario, 1111 1101 , in decimale, per prima cosa dobbiamo trovare il suo complemento a 2, che sarà:

 1111 1101 → 0000 0010 + 1 → 0000 0011 

Questo è il complemento a 2. La rappresentazione decimale del numero binario, 0000 0011 , è 3 . E, dal momento che il bit del segno era uno come menzionato sopra, quindi la risposta risultante è -3 .

Suggerimento: se leggi attentamente questa procedura, avresti osservato che il risultato per l’operatore del complemento a una persona è in realtà il numero (operando – sul quale viene applicato questo operatore) più uno con un segno negativo. Puoi provare anche con altri numeri.

Semplicemente ………..

Come complemento a 2 di qualsiasi numero che possiamo calcolare invertendo tutti i numeri da 1 a 0 e viceversa, aggiungiamo 1 ad esso.

Qui N = ~ N produce risultati – (N + 1) sempre. Perché i dati del negozio di sistema sono in forma di complemento a 2, il che significa che memorizza ~ N in questo modo.

  ~N = -(~(~N)+1) =-(N+1). 

Per esempio::

  N = 10 = 1010 Than ~N = 0101 so ~(~N) = 1010 so ~(~N) +1 = 1011 

Ora il punto è da dove arriva. La mia opinione è che abbiamo un registro a 32 bit che significa 2 ^ 31 -1 bit coinvolti nel funzionamento e per riposare un bit che cambia nel calcolo precedente (complemento) memorizzato come bit di segno che è 1 di solito. E otteniamo risultati come ~ 10 = -11.

~ (-11) = 10;

Quanto sopra è vero se printf (“% d”, ~ 0); otteniamo risultato: -1;

Ma printf (“% u”, ~ 0) del risultato: 4294967295 sulla macchina a 32 bit.


L’operatore del complemento bitwise (~) è un operatore unario .

Funziona secondo i seguenti metodi

Innanzitutto converte il numero decimale dato nel corrispondente valore binario. In caso di 2, converte prima 2 a 0000 0010 (a 8 bit numero binario).

Quindi converte tutti gli 1 nel numero in 0 e tutti gli zeri in 1, quindi il numero diventerà 1111 1101.

questa è la rappresentazione del complemento a 2 di -3.

Per trovare il valore senza segno usando il complemento, cioè semplicemente per convertire 1111 1101 in decimale (= 4294967293), possiamo semplicemente usare% u durante la stampa.

Penso che per la maggior parte delle persone la parte della confusione derivi dalla differenza tra il numero decimale e il numero binario con segno, quindi chiariamolo prima:

per mondo decimale umano: 01 significa 1, -01 significa -1, per il mondo binario del computer: 101 significa 5 se non è firmato. 101 significa (-4 + 1) se è firmato mentre la cifra firmata è in posizione x. | X

bit 2 di flipped = 2 = ~ (010) = 101 = -4 + 1 = -3 la confusione deriva dal missaggio del risultato firmato (101 = -3) e del risultato non definito (101 = 5)

Per prima cosa dobbiamo dividere la cifra data nelle sue cifre binarie e poi invertirla aggiungendo all’ultima cifra binaria. Dopo questa esecuzione dobbiamo dare il segno opposto alla cifra precedente di cui stiamo trovando il complimento ~ 2 = -3 Spiegazione : Il formato binario 2s è 00000010 modifiche a 11111101 questo è un complemento, quindi è conforms a 00000010 + 1 = 00000011 che è il formato binario di tre e con -sign Ie, -3

L’operatore bit-saggio è un operatore unario che lavora sul metodo dei segni e delle magnitudini secondo la mia esperienza e conoscenza.

Ad esempio ~ 2 risulterebbe in -3.

Questo perché l’operatore bit-wise dovrebbe prima rappresentare il numero in segno e grandezza che è 0000 0010 (operatore a 8 bit) in cui l’MSB è il bit di segno.

Poi più tardi ci vorrebbe il numero negativo di 2 che è -2.

-2 è rappresentato come 1000 0010 (operatore a 8 bit) in segno e grandezza.

Successivamente aggiunge 1 al LSB (1000 0010 + 1) che ti dà 1000 0011.

Quale è -3.

Javascript tilde (~) costruisce un dato valore per il complemento a uno – tutti i bit sono invertiti. È tutto ciò che fa la tilde. Non è un segno supponente. Non aggiunge né sottrae alcuna quantità.

 0 -> 1 1 -> 0 ...in every bit position [0...integer nbr of bits - 1] 

Su processori desktop standard che usano linguaggi di alto livello come JavaScript, l’aritmetica firmata BASE10 è la più comune, ma tieni presente che non è l’unico tipo. I bit a livello di CPU sono soggetti a interpretazione in base a una serie di fattori. A livello di ‘codice’, in questo caso JavaScript, vengono interpretati come un intero con segno a 32 bit per definizione (lasciamo fluttuare fuori da questo). Consideralo quantico, quei 32 bit rappresentano contemporaneamente tutti i possibili valori. Dipende interamente dalla lente di conversione che le vedi attraverso.

 JavaScript Tilde operation (1's complement) BASE2 lens ~0001 -> 1110 - end result of ~ bitwise operation BASE10 Signed lens (typical JS implementation) ~1 -> -2 BASE10 Unsigned lens ~1 -> 14 

Tutto quanto sopra è vero allo stesso tempo.