組み込み開発のためのPython · レッスン 195 / 220

算術演算とビット演算

整数の除算、マスク、シフトを使ってレジスタ値やフラグを読み解きます。

レジスタやプロトコルのフィールドは、整数のビットとして扱う場面があります。Pythonの整数は任意精度ですが、実機のレジスタ幅は有限なので、幅を明示したマスクが必要です。

除算と丸めの意味を選ぶ

`/`は浮動小数点数の除算、`//`は切り捨て除算、`%`は余りです。分周器や配列位置を求めるときに、どの丸めが必要かを仕様から判断します。浮動小数点数は二進表現の近似誤差を持つので、境界判定に使う場合は許容差や整数単位への変換を検討します。

幅を決めてからビットを読む

ANDでマスクを取り出し、シフトでフィールド位置を合わせます。Pythonの`~`は固定幅のNOTではないため、8ビット値なら`(~value) & 0xFF`のように幅でマスクします。負数や符号付き表現は対象CPU・仕様に合わせて解釈し、通信値のバイト順も別途確認します。

コード例

手元のPython環境に貼り付ける前に、使用しているPythonの版と対象ライブラリの対応を確認してください。

status = 0b1010_0110
width_mask = 0xFF
ready = bool(status & (1 << 7))
mode = (status >> 4) & 0b11
cleared = status & ~(1 << 2) & width_mask
print(f"ready={ready}, mode={mode}, cleared=0x{cleared:02X}")

手を動かす課題

8ビットの値から3〜5番目のビットを取り出し、指定した1ビットだけをセットする式を作ってください。

参考資料

「2. 値・文字列・条件分岐」の章一覧へ