true | false の解説と実装リファレンス

記事内には広告が含まれています。

【概要】

true | false は、Arduino(C/C++)において、ビット演算子 |(Bitwise OR)を用いて、論理値(Boolean)である true と false を演算する式です。この演算は、各値をビット単位で比較し、いずれかのビットが 1 であれば 1 を返す動作を行います。

Arduinoにおける true は内部的に 1、false は 0 として定義されているため、この演算は実質的に 1 | 0 を実行していることと同義です。

【仕様】

  • 演算子: | (Bitwise OR)
  • オペランド:
  • true: 論理真(数値として 1)
  • false: 論理偽(数値として 0)
  • 戻り値: true (数値として 1)
  • データ型: bool(またはコンパイラの実装に依存する int 型へのプロモーション)
  • 計算順序: 左から右へ評価されるが、ビット演算子であるため短絡評価(Short-circuit evaluation)は行われない。

【技術的特徴】

論理演算子 || との比較

最も重要な違いは「短絡評価」の有無です。
– true || false (Logical OR): 左辺が true の場合、右辺の評価をスキップします。条件分岐の最適化に寄与します。
– true | false (Bitwise OR): 左辺の状態に関わらず、必ず両方のオペランドを評価します。ビット単位の操作を意図する場合に使用されます。

ハードウェアレベルの挙動

Arduino(AVR, ESP32, STM32等)のCPUレベルでは、この演算は「OR」命令(例: AVRの OR 命令)に直接マッピングされます。論理演算 || の場合は、条件分岐命令(BREQ 等)を介した処理となるため、実行パスが異なります。

【注意点】

  • 短絡評価の欠如: if (A | B) と記述した場合、A が真であっても B の式が評価されます。もし B が関数呼び出しや副作用を伴う処理である場合、意図しない動作を招く可能性があります。
  • 型変換: bool 型を | で演算すると、内部的に int にキャストされることがあります。ビットマスク操作と混同しないよう、論理判定には || を使用するのが標準的な作法です。
  • リソース: 組み込みシステムにおいて、極端に複雑なビット演算をループ内で繰り返す場合、CPUサイクルへの影響を考慮する必要がありますが、単一の true | false は無視できる程度の負荷です。

【サンプルコード】

void setup() {
  Serial.begin(9600);
}

void loop() {
  bool val1 = true | false;   // ビット演算: 1 | 0 = 1
  bool val2 = true || false;  // 論理演算: 短絡評価あり

  Serial.print("Bitwise OR (true | false): ");
  Serial.println(val1);

  Serial.print("Logical OR (true || false): ");
  Serial.println(val2);

  delay(2000);
}

【活用例】

  • ビットフラグの合成: 複数の状態フラグ(例:0x01, 0x02)を組み合わせて、現在のデバイス状態を判定する際のビットマスク操作。
  • レジスタ操作: GPIO制御やタイマー設定において、特定のビットのみを立てる処理(例:PORTB |= (1 << 5);)。
  • ステータス確認: 複数のセンサー異常フラグのいずれかが立っているかを確認する際の、ビット演算による高速な状態集約。

コメント

タイトルとURLをコピーしました