ビット演算
読み:ビットえんざん

 2進数で表現されたデータの各桁(ビット)を直接操作する演算のこと。
目次

概要
 ビット演算はビットを操作する演算であり、いわゆる論理演算よりも広い概念である。
 各種論理演算に加え、ビットシフトローテートなどの演算を含む。

論理演算

論理積(AND)
 論理積は二項演算であり、互いのビットがどちらも1であれば出力が1となる。ビット演算における掛け算ともいえる。
 C/C++では、論理積のビット論理演算子は&(アンパサンド)である。
 なお、C/C++の&&は論理関係演算子であり、引数全体を一つの論理値(ブーリアン)として扱い演算をするもので、ビット演算ではない。
 x = a & b;
 上の例は、C/C++で、aとbの論理積をxに代入する。この演算は、ビット列から特定のビットを取り出すために用いられることもある。

論理和(OR)
 論理和は二項演算であり、互いのビットのどちらかが1であれば出力が1となる。ビット演算における足し算ともいえる。
 C/C++では、論理和のビット論理演算子は|(縦棒)である。
 なお、C/C++の||は論理関係演算子であり、引数全体を一つの論理値(ブーリアン)として扱い演算をするもので、ビット演算ではない。
 x = a | b;
 上の例は、C/C++で、aとbの論理和をxに代入する。この演算は、ビット列がフラグになっていて、特定のビットを立てるような場合にもよく用いられている。

排他的論理和(XOR)
 排他的論理和は二項演算であり、互いのビットが不一致であれば出力が1となる。
 C/C++では、排他的論理和のビット論理演算子は^(サーカムフレックス)である。
 なお、C/C++には、排他的論理和の論理関係演算子はなく、ビット演算のみが存在する。
 x = a ^ b;
 上の例は、C/C++で、aとbの排他的論理和をxに代入する。

論理否定(NOT)
 論理否定は一項演算であり、項のビットが0であれば出力が1となる。
 C/C++では、論理否定のビット論理演算子は~(チルダ)である。
 なお、C/C++の!(エクスクラメーション)は論理関係演算子であり、引数全体を一つの論理値(ブーリアン)として扱い演算をするもので、ビット演算ではない。
 x = ~a;
 上の例は、C/C++で、aの論理否定をxに代入する。

ビットシフト
 ビットシフトも、広い意味でのビット演算の一種である。
 マイクロプロセッサーのレジスターは特定の長さのビット列を持ち、この範囲内で右又は左にビット列をずらす演算を行なうことができる。これがビットシフトである。
 ビット列のうち、符号の扱い方によって大きく、論理シフトと算術シフトに分けられる。

論理シフト
 論理シフトは、符号のない2進数を扱うビットシフトである。
 左シフトでは、あふれたビットは単に消える。プロセッサーによっては、その内容をキャリーフラグ等に格納するものがある。
 右シフトでは、空いたビット(最上位ビット)には常に0が格納される。

算術シフト
 算術シフトは、2の補数形式の符号付き2進数を扱うビットシフトである。最上位ビットは常に符ビットとなっている。
 左シフトでは、あふれたビットは単に消える。プロセッサーによっては、その内容をキャリーフラグ等に格納するものがある。
 右シフトでは、空いたビット(最上位ビット)には符号ビットと同じ内容が格納される。

ローテート
 ローテートも、広い意味でのビット演算の一種である。
 ローテートは論理ビットシフトと同様の動作をするが、あふれたビットが空いたビットに格納され、もって全体として回転しているように見えるのが特徴である。

キャリーなしローテート
 一般的なローテートで、右または左方向にビットシフトし、あふれた分が空いたビットに複写される。
 ビットシフトと同様に、プロセッサーによっては、あふれた内容をキャリーフラグ等に格納するものがある。

キャリーつきローテート
 特殊なローテートで、最上位ビットと最下位ビットの間にもう1ビットのキャリーフラグを連結したような構造でローテートするものである。
 空いたビットにはキャリーフラグの内容が入り、次にあふれたビットをキャリーフラグに入れる。
 実質、レジスター長よりも1ビット大きな値を扱うことができる。

再検索