0b10000000
を8bitの符号付整数として解釈すると -128
になるが、Pythonでは 128
と解釈されてしまう。
Pythonのintは有限bitではないので、先頭のビットが符号ビットとして解釈されないことが理由なのだが、ラズパイでセンサーなんかを触っていると8bitの符号付整数として扱いたいときがある。
そんな時に、intを任意bitの符号付整数として解釈する方法を残しておく。
8bitの符号付整数として解釈する
n = 0b10000000 # 128
mask = 0b11111111 # 8bitのマスクを用意
# nを8bitの符号付整数として解釈する
# - `n ^ mask` : 単純なビット反転
# - `~` で符号を考慮したビット反転
~(n ^ mask) # -128
16bitの符号付整数として解釈する
n = 0b100000000000000 # 32768
mask = 0b1111111111111111 # 16bitのマスクを用意
# nを16bitの符号付整数として解釈する
# - `n ^ mask` : 単純なビット反転
# - `~` で符号を考慮したビット反転
~(n ^ mask) # -32768
関数化
def signed(n: int, bits: int = 8) -> int:
mask = 2 ** bits -1
return ~(n ^ mask)