2012-11-21 11 views
9

C'è un modo semplice per produrre un complemento a uno in python?Da esadecimale al complemento di uno in Python

Ad esempio, se si prende il valore esadecimale 0x9E, è necessario convertirlo in 0x61.

Ho bisogno di scambiare gli 1 binari per 0 e 0 per 1. Sembra che questo dovrebbe essere semplice.

risposta

23

Basta usare the XOR operator ^ contro 0xFF:

>>> hex(0x9E^0xFF) 
'0x61' 

Se avete bisogno di lavorare con i valori più grandi di un byte, è possibile creare la maschera dal int.bit_length() method sul valore:

>>> value = 0x9E 
>>> mask = (1 << value.bit_length()) - 1 
>>> hex(value^mask) 
'0x61' 
>>> value = 0x9E9E 
>>> mask = (1 << value.bit_length()) - 1 
>>> hex(value^mask) 
'0x6161' 
+0

OK Sono confuso, perché '' x 'sbagliato? Dopotutto dovrebbe essere l'operatore di negazione binaria. Non riesco a comprendere la mancanza di distinzione firmata/non firmata quando si tratta di operazioni binarie – Kos

+1

@Kos: '~' restituisce letteralmente '- (x + 1)', che è ottimo quando si tratta di valori firmati. Quindi '~ 0x9E' è' -159', o ​​esadecimale '-0x9f'. Per lavori bit a bit senza segno, non così grandioso .. –

+0

OK Ho capito, la "sequenza concettualmente infinita di' 1' di fronte ai numeri negativi "di Python ha incasinato la mia testa. Analogie a operazioni bit a bit su C non funzioneranno qui :( – Kos

1

Hah. appena scoperto che python bin() restituisce una stringa!

così possiamo divertirci un po '!

for x in numbers: # numbers is a list of int 
    b = bin(x) 
    #print b # e.g. String 0b1011100101 
    b = b.replace('0', 'x') 
    b = b.replace('1', '0') 
    b = b.replace('x', '1') 
    b = b.replace('1b', '0b') 
    #print b # String 0b0100011010 
    print int(b, 2) # the decimal representation 
Problemi correlati