2012-11-21 8 views

Odpowiedz

23

Wystarczy użyć the XOR operator ^ przeciwko 0xFF:

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

Jeśli trzeba pracować z wartościami większymi niż bajt, można utworzyć maskę od int.bit_length() method na swojej wartości:

>>> 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 Jestem zdezorientowany, dlaczego '~ x' jest nieprawidłowy? W końcu ma być operatorem binarnej negacji. Nie mogę się nadziwić brakiem podpisanego/niepodpisanego rozróżnienia, gdy chodzi o operacje binarne. – Kos

+1

@Kos: '~' dosłownie zwraca '- (x + 1)', co jest świetne, gdy mamy do czynienia z podpisanymi wartościami. Zatem '~ 0x9E' ma wartość' -159' lub '-0x9f'. Dla niepodpisanej bitowej pracy, niezbyt wielka ... –

+0

OK Dostałem to, "konceptualnie nieskończony ciąg" 1 "w języku Pythona przed liczbami ujemnymi" podejście pomieszało się z moją głową. Analogie do C bitwise ops nie zadziałają tutaj :( – Kos

1

hah. właśnie dowiedziałem się, że python bin() zwraca ciąg znaków!

dzięki czemu możemy się w tym bawić!

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 
Powiązane problemy