2
0

【Python】数値を有限bitの符号付整数として解釈する方法

Last updated at Posted at 2024-01-30

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)
2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0