Есть ли простой способ создать дополнение в python?
Например, если вы возьмете шестнадцатеричное значение 0x9E
, мне нужно преобразовать его в 0x61
.
Мне нужно поменять местами двоичные 1 на 0 и 0 на 1. Такое ощущение, что это должно быть просто.
Есть ли простой способ создать дополнение в python?
Например, если вы возьмете шестнадцатеричное значение 0x9E
, мне нужно преобразовать его в 0x61
.
Мне нужно поменять местами двоичные 1 на 0 и 0 на 1. Такое ощущение, что это должно быть просто.
Просто используйте оператор XOR ^
против 0xFF:
>>> hex(0x9E ^ 0xFF)
'0x61'
Если вам нужно работать со значениями больше байта, вы можете создать маску из int.bit_length()
method для вашего значения:
>>> value = 0x9E
>>> mask = (1 << value.bit_length()) - 1
>>> hex(value ^ mask)
'0x61'
>>> value = 0x9E9E
>>> mask = (1 << value.bit_length()) - 1
>>> hex(value ^ mask)
'0x6161'
~x
неправильно? В конце концов, это должен быть оператор бинарного отрицания. Я не могу понять отсутствие различия между знаками и без знака, когда речь идет о двоичных операциях.
- person Kos; 21.11.2012
~
буквально возвращает -(x+1)
, что очень удобно при работе со значениями со знаком. Итак, ~0x9E
— это -159
или -0x9f
в шестнадцатеричном формате. Для неподписанной побитовой работы не так уж и здорово.
- person Martijn Pieters; 21.11.2012
1
перед подходом к отрицательным числам, запутала мою голову. Аналогии с побитовыми операциями C здесь не сработают :(
- person Kos; 21.11.2012
|
побитово или случайно). Однако вам все равно нужно создать маску.
- person Martijn Pieters; 21.11.2012
Ха. только что узнал, что python bin()
возвращает строку!
так что мы можем немного повеселиться!
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