Come funziona il "bit flipping / complementing"?

6

Attualmente sto imparando sull'operazione bit a bit, quindi abbi pazienza con me. Capisco AND, OR e spostando. Quello che non capisco è un po 'capovolto.

Quindi, 5 è 0101 . Quando qualcuno mi dice "capovolgi quelli", risulterebbe in 1010 che è 10 . Quindi, perché ~5 risulta in -6 ?

Penso di aver sbagliato molto. Qualcuno può illuminarmi?

(Lo sto mettendo qui perché penso che sia una domanda generale di programmazione e non una specifica, che dovrebbe appartenere allo stack overflow).

Modifica 1 Grazie al commento di mcfinnigan ho appreso che esiste un "bit più significativo" che definisce se un numero è positivo o negativo (correggimi se sbaglio). Questo spiegherebbe perché i risultati positivi finiscono con il negativo e viceversa. Tuttavia, l'esempio precedente IMO risulterebbe in -10 quindi.

Modifica 2 Grazie a Don 01001100 e S.Lott, ho finalmente capito.

    
posta pduersteler 24.02.2012 - 14:56
fonte

3 risposte

11

Se stai usando un intero con segno del complemento a due, allora il primo bit indica il segno, mentre i bit rimanenti eseguono il conto alla rovescia da -1, con -1 rappresentato come tutti i bit "1", quindi, eseguendo il conto alla rovescia, hai :

 7: 0111
 6: 0110
 5: 0101
 4: 0100
 3: 0011
 2: 0010
 1: 0001
 0: 0000
-1: 1111
-2: 1110
-3: 1101
-4: 1100
-5: 1011
-6: 1010
-7: 1001
-8: 1000
    
risposta data 24.02.2012 - 15:16
fonte
6

Come spiegato nell'articolo Wikipedia sul proprio complemento , ci sono almeno tre diversi sistemi per rappresentare numeri binari firmati:

  • grandezza segno: questo è il sistema in cui il bit più significativo rappresenta il segno e il resto della parola rappresenta la grandezza del numero. In questo sistema, una rappresentazione di -5 a 8 bit sarebbe 10000101. Questo è concettualmente semplice, ma ha alcuni problemi. Ad esempio, per i numeri a 8 bit, 00000000 - 00000001 = 11111111 , vale a dire che 0 - 1 = -127. Per fare la matematica con i numeri di magnitudine del segno, devi considerare il bit del segno separatamente dal resto del valore.

  • complemento a una: i numeri negativi sono rappresentati invertendo tutti i bit. Di nuovo, questo è concettualmente semplice, ma soffre del fatto che ci sono due rappresentazioni di 0: 00000000 e 11111111.

  • complemento a due: i numeri negativi si formano prendendo il complemento del numero e aggiungendo 1. Questo sistema evita i problemi spiegati sopra: c'è solo una rappresentazione di 0, e non 'richiedono un trattamento speciale per il bit del segno.

Vale la pena sottolineare che in tutti e tre i sistemi, puoi dire il segno di un numero osservando il bit più significativo. Con la magnitudine del segno, è necessario spostare il bit più significativo se si modifica la dimensione della rappresentazione di un numero: 1101 diventa 10000101 quando si passa da una rappresentazione a 4 bit a 8 bit. Con il complemento a due e il complemento a due, puoi invece "firmare estendere" il numero, il che significa che basta replicare il bit più significativo: 1101 diventa 1111101.

So, 5 is 0101. When someone says to me "flip those", it would result in 1010 which is 10. So why does ~5 result in -6?

Il complemento a due è lo standard oggi, quindi è necessario fare più che capovolgere i bit. È inoltre necessario aggiungere 1. Per formare -5, si inizia con 0101, si capovolgono tutti i bit per ottenere 1010 e quindi si aggiunge 1 per arrivare a 1011. È possibile verificare che questo sia davvero -5 cambiando di nuovo il segno: iniziare con 1011, capovolgi i bit per ottenere 0100 e aggiungi 1 per arrivare a 0101, che è 5.

    
risposta data 24.02.2012 - 15:53
fonte
3

Non hai proprio ragione. Userò i valori del complemento a 32-bit 2, poiché sono piuttosto comuni.

Non è 00000000 00000000 00000000 00001010

(Che non è 9, BTW, controlla la matematica con più attenzione.)

È 11111111 11111111 11111111 11111010

Che è -6

    
risposta data 24.02.2012 - 15:06
fonte

Leggi altre domande sui tag