2015-09-22 2 views
1

У меня есть формула: (короткая) (0xF800 | (N & 0x7ff)). С помощью C/CPP/C# я изменил знак восьмибитовых чисел (например, 1202 номера до -846). В Python этот трюк не работает. Как получить тот же результат?Работа с битом в python

+0

число не восемь бит, это одиннадцать бит! typo –

+0

Что вы пытаетесь на самом деле выполнить? Зачем вам нужно установить верхние пять бит в 1? Вы понимаете, что с коротким 0xF800 | (N & 0x7FF) == 0xF800 | N? – zstewart

ответ

0

Если вы хотите работать с (++) типами C вам нужно будет использовать struct или ctypes модулей

Этого метод использует-структуру для упаковки целого числа в строку байт, а затем распаковать его в качестве другого типа ,

>>> 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 
+0

что быстрее? ctypes или struct? –

+0

производительность, вероятно, не является важной проблемой здесь, так же как и то, что вы собираетесь делать с данными, как только вы ее получите. Если вы просто конвертируете одно значение за раз, и вам не нужно записывать исходные строки байтов, то ctypes будет в порядке. В противном случае вам, вероятно, нужна структура. –

0

может быть, кто-то будет нужно:

От ctypes импорта c_short C_short (0xF800 | (N & 0x7ff)). Значение

2

Целые числа в Python имеют бесконечную длину. Чтобы сделать отрицательное число, вам нужно установить верхний бит, но нет «вершины» с Python - вы не можете сделать это с помощью бит-манипуляции. Что вы может do конвертировать положительное число в отрицательное с вычитанием.

bits = 0xf800 | (N & 0x7ff) 
if bits & 0x8000: 
    bits -= 0x10000 

Так как вы уже знаете, верхний бит установлен, то это упрощает:

bits = (0xf800 | (N & 0x7ff)) - 0x10000 
Смежные вопросы