У меня есть формула: (короткая) (0xF800 | (N & 0x7ff)). С помощью C/CPP/C# я изменил знак восьмибитовых чисел (например, 1202 номера до -846). В Python этот трюк не работает. Как получить тот же результат?Работа с битом в python
ответ
Если вы хотите работать с (++) типами 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
что быстрее? ctypes или struct? –
производительность, вероятно, не является важной проблемой здесь, так же как и то, что вы собираетесь делать с данными, как только вы ее получите. Если вы просто конвертируете одно значение за раз, и вам не нужно записывать исходные строки байтов, то ctypes будет в порядке. В противном случае вам, вероятно, нужна структура. –
может быть, кто-то будет нужно:
От ctypes импорта c_short C_short (0xF800 | (N & 0x7ff)). Значение
Целые числа в Python имеют бесконечную длину. Чтобы сделать отрицательное число, вам нужно установить верхний бит, но нет «вершины» с Python - вы не можете сделать это с помощью бит-манипуляции. Что вы может do конвертировать положительное число в отрицательное с вычитанием.
bits = 0xf800 | (N & 0x7ff)
if bits & 0x8000:
bits -= 0x10000
Так как вы уже знаете, верхний бит установлен, то это упрощает:
bits = (0xf800 | (N & 0x7ff)) - 0x10000
- 1. Работа с объединениями с нечетным битом
- 2. операции с обратным битом
- 3. Что случилось с этим битом кода python с помощью лямбда?
- 4. Сравнение C++ с младшим битом
- 5. Как переименовать файлы, содержащие пробелы с битом?
- 6. Проблема с битом сдвига Perl
- 7. Работа с массивами в Python
- 8. Работа с JSON в Python
- 9. Работа с файлами в Python?
- 10. Работа с курсорами в Python
- 11. Работа с китайцами в Python
- 12. Работа с числами в Python
- 13. Работа с картой в python
- 14. Работа с unicode в python
- 15. Работа с реестром в Python
- 16. Работа с ljpeg в Python
- 17. Работа с классами в Python
- 18. Работа с питанием в Python
- 19. Работа с перечислением в Python
- 20. python - работа с crontab
- 21. Работа с словарями python
- 22. Работа \ n в python
- 23. Работа фильтра в Python
- 24. Работа с фреймами - Python Webdriver
- 25. Python 3 - работа с файлами
- 26. Python - Работа с утечками памяти
- 27. Работа с функциями (Basic Python)
- 28. Python - работа с .csv-файлами
- 29. Работа с несколькими версиями Python?
- 30. Работа с многоязычными каталогами (Python)
число не восемь бит, это одиннадцать бит! typo –
Что вы пытаетесь на самом деле выполнить? Зачем вам нужно установить верхние пять бит в 1? Вы понимаете, что с коротким 0xF800 | (N & 0x7FF) == 0xF800 | N? – zstewart