Работа с битом в питоне
У меня есть формула: (короткая) (0xF800 | (N & 0x7ff)). С помощью C/CPP/C# я изменил знак восьмибитных чисел (например, номера 1202 на -846). В Python этот трюк не работает. Как получить такой же результат?
3 ответа
Целые числа в Python имеют бесконечную длину. Чтобы сделать отрицательное число, вам нужно установить верхний бит, но в Python нет "верха" - вы не можете сделать это с помощью битовых манипуляций. Что вы можете сделать, это преобразовать положительное число в отрицательное с вычитанием.
bits = 0xf800 | (N & 0x7ff)
if bits & 0x8000:
bits -= 0x10000
Поскольку вы уже знаете, что установлен верхний бит, это упрощает:
bits = (0xf800 | (N & 0x7ff)) - 0x10000
Может кому-то понадобится
Из ctypes импортируйте c_short C_short (0xF800 | (N & 0x7ff)). Значение
Если вы хотите работать с типами C(++), вам нужно использовать модули struct или ctypes
Этот метод использует struct для упаковки целого числа в байтовую строку, а затем распаковывает его как другой тип.
>>> import struct
>>> N = 1202
>>> struct.unpack('h', struct.pack('H',0xf800|(N & 0x7ff)))[0]
-846
Этот метод использует ctypes, который имеет внутреннее представление, аналогичное тому, которое вы имели бы в C(++)
>>> from ctypes import c_short
>>> N = 1202
>>> c_short(0xf800|(N & 0x7ff)).value
-846