エンジニアの備忘録

仕事や趣味でのトラブルシューティングの備忘録

Pythonで符号付き8bit整数を扱う(2の補数)

Raspberry Piで他の機器からSPIでsinged char(符号付き8bit)のデータをもらって、Pythonで処理しようとしたが、Pythonで2の補数で10進数に変換できなくて困った. 調べたところ、Pythonの標準関数ではできないそう. stackoverflowにのっていた関数を使わさせてもらって、簡単にできた. http://stackoverflow.com/questions/1604464/twos-complement-in-python

符号付き8bitを10進数に変換

>>> def s8(value):
...     return -(value & 0b10000000) | (value & 0b01111111)

このような関数s8を定義すれば

>>> s8(int('11111',2))
31
>>> s8(int('11111111',2))
-1
>>> s8(int('11111100',2))
-4

と符号付き8bitを10進数に変換できた.

符号付き16bitの場合

>>> def s16(value):
...     return -(value & 0b1000000000000000) | (value & 0b0111111111111111)