От шестнадцатеричного до дополнения в Python

Есть ли простой способ создать дополнение в python?

Например, если вы возьмете шестнадцатеричное значение 0x9E, мне нужно преобразовать его в 0x61.

Мне нужно поменять местами двоичные 1 на 0 и 0 на 1. Такое ощущение, что это должно быть просто.


person user1841870    schedule 21.11.2012    source источник


Ответы (2)


Просто используйте оператор 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'
person Martijn Pieters    schedule 21.11.2012
comment
Хорошо, я запутался, почему ~x неправильно? В конце концов, это должен быть оператор бинарного отрицания. Я не могу понять отсутствие различия между знаками и без знака, когда речь идет о двоичных операциях. - person Kos; 21.11.2012
comment
@Kos: ~ буквально возвращает -(x+1), что очень удобно при работе со значениями со знаком. Итак, ~0x9E — это -159 или -0x9f в шестнадцатеричном формате. Для неподписанной побитовой работы не так уж и здорово. - person Martijn Pieters; 21.11.2012
comment
ОК, я понял, концептуально бесконечная строка Python, состоящая из 1 перед подходом к отрицательным числам, запутала мою голову. Аналогии с побитовыми операциями C здесь не сработают :( - person Kos; 21.11.2012
comment
@aka.nice: Конечно, это работает (я использовал | побитово или случайно). Однако вам все равно нужно создать маску. - 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
person gcb    schedule 26.09.2014
comment
Это только что попало в первую пятерку моего списка самых прагматичных кодов :) - person Joe; 10.06.2020