HOME > 技術談話 > ビット演算子

はじめに データ型 演算子の種類 演算結果の例 代入演算子 優先度の注意点


■はじめに

 情報の最小単位であるビット毎に論理演算処理を行い、ビット毎の処理結果は他のビットへ影響を与えません。


■データ型

 通常は符号無し整数型を利用します。
 符号付き整数型を使用した場合は処理系に依存し、意図しない結果を招く恐れがありますのでご注意ください。


■演算子の種類

名称 記述例 処理 優先度 備考
補数 Y = ~A 1であれば0、0であれば1 否定、1の補数扱い
論理積 Y = A & B 対応するビットが1の時に1、それ以外は0
排他的論理和 Y = A ^ B 対応するビットが異なる時に1、それ以外は0
論理和 Y = A | B 対応するビットが0の時に0、それ以外は1

■演算結果の例(2進数表記)

補数 0 1 0 1 1 1 0 0 … A = 5CH
---------------
1 0 1 0 0 0 1 1 … Y = A3H

論理積 0 1 0 1 1 1 0 0 … A = 5CH
0 0 1 1 0 0 1 1 … B = 33H
---------------
0 0 0 1 0 0 0 0 … Y = 10H

排他的論理和 0 1 0 1 1 1 0 0 … A = 5CH
0 0 1 1 0 0 1 1 … B = 33H
---------------
0 1 1 0 1 1 1 1 … Y = 6FH

論理和 0 1 0 1 1 1 0 0 … A = 5CH
0 0 1 1 0 0 1 1 … B = 33H
---------------
0 1 1 1 1 1 1 1 … Y = 7FH

■代入演算子

名称 記述例 処理 優先度 備考
論理積代入 Y &= X 右辺から左辺にAND代入
排他的論理和代入 Y ^= X 右辺から左辺にXOR代入
論理和代入 Y |= X 右辺から左辺にOR代入

 右辺には演算式を記述することができます。演算の優先度は他の演算子に比べ最低位なので、例えば
  Y &= A | B
と記述した場合は、
  Y &= (A | B)
更に、
  Y = Y & (A | B)
と等価です。


■優先度の注意点

 演算子が同じ優先度であれば式の入れ替えは可能ですが、優先度が異なる場合は注意が必要です。

 例えば、
  Y = A | B & C 
 この式は
  Y = A | (B & C)
と等価です。
  Y = (A | B) & C
ではありません。

 論理演算は実生活で使う機会が少なく勘違いしやすい演算のひとつです。
 優先度を意識せず、勘違いしたままではプログラムをいくら眺めても間違いを見つけることは困難です。
 また、評価データの数が少ないと間違いを発見することすら困難です。

 そこで総ての組み合わせを網羅した真理値表の登場です。
 実際に双方の式を真理値表に当てはめて見ます。確かに演算結果が異なります。

 Y = (A | B) & C の場合

A B C (A | B) C (A | B) & C
0 0 0 0 0 0
0 0 1 0 1 0
0 1 0 1 0 0
0 1 1 1 1 1
1 0 0 1 0 0  ここがちがう
1 0 1 1 1 1
1 1 0 1 0 0  ここがちがう
1 1 1 1 1 1

 Y = A | (B & C) の場合

A B C A (B & C) A | (B & C)
0 0 0 0 0 0
0 0 1 0 0 0
0 1 0 0 0 0
0 1 1 0 1 1
1 0 0 1 0 1  ここがちがう
1 0 1 1 0 1
1 1 0 1 0 1  ここがちがう
1 1 1 1 1 1

 このような間違いを防ぐために、三項以上の演算ではコーディング時に明示的な括弧を付けることを薦めます。

 たとえ、
  Y = A | B & C
という演算式で、「&」を先に演算しても良い場合でも
  Y = A | (B & C)
の様に括弧を付けて記述することです。読み手の意識を括弧に誘導することで勘違いを低減することができます。

 この方法は、通常の四則演算で掛け算、割り算をコーディングする際に使用しても何ら問題ありません。
 また、代入演算子の右辺に使っても問題ありません。

 更に追記すると、論理演算を使用したコーディングについては真理値表で漏れなく確認することが大切です。


Copyright 2007-2009 PaletteSoft LLC. All rights reserved. 利用条件 | HOME | サイトマップ | お問合せ