Как вывести Hex из 2's complement силами Python?

Есть такая задача: Есть ID-шник: 10088363095792553999 Его hex очень даже легко найти: 0x8C0110C901E0100F. Получить эти данные тоже легко силами python:

value = 10088363095792553999
hex_value = hex(value)  # 0x8c0110c901e0100f

Онлайн калькулятор подсказывает, что из Hex'a его 2's complement будет "-8358380977916997617". Не знаю, можно ли тут выкладывать ссылки на сторонние ресурсы, но конвертер легко найти в гугле по запросу "Hexadecimal to Decimal converter". Есть пробел: я не знаю, как питоном вывести из Хекса его 2's complement. НО! Что самое тут нужное, это обратная операция: необходимо из значения его 2's complement (-8358380977916997617) силами Python получить обратно его хекс - 0x8c0110c901e0100f. Возможно ли это?


Ответы (1 шт):

Автор решения: Павел

Вопрос уже довольно подробно раскрыт здесь.

Приведу рабочее решение для вашего примера:

def twos_complement(n, w):
    if n & (1 << (w - 1)):
        n = n - (1 << w)
    return n


def int2hex(number, bits):
    if number < 0:
        return hex((1 << bits) + number)
    return hex(number)


hex_value = '0x8c0110c901e0100f'
value = twos_complement(int(hex_value, 16), 64)
print(value)  # -8358380977916997617

print(int2hex(value, 64))  # 0x8c0110c901e0100f
→ Ссылка