ビット演算子

ビット演算子とは整数型の数値に対してビット単位で演算を行うときに使用する演算子です。ビット AND やビット OR などの他にシフト演算子などが利用できます。ここでは C 言語におけるビット演算子の使い方について解説します。

(Last modified: )

ビット演算子の種類

ビット演算子とは整数型の数値に対してビット単位で演算を行うときに使用する演算子です。例えば 10 進数で 7 と言う数値を 2 進数で表現してみます。

10進数    7
 2進数    0000000000000111

2 進数では各位置が 0 か 1 の値となります。それぞれの値をビットと呼びます。ビット演算子の種類には次のものがあります。

演算子記述例意味
&a = b & 0x4FビットAND
|a = b | 0x0FビットOR
^a = b ^ 0xFFビットXOR
~a = ~aビットNOT
<<=a = a << 2左シフト
>>=a = a >> 2右シフト

※記述例は変数の値が short int 型を想定しています。

ビット演算子の中で左シフトと右シフトはシフト演算子とも呼ばれます。シフト演算子については次のページで確認します。

ではそれぞれの演算子について確認してみます。

ビットAND

ビット AND は演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットが共に 1 の場合だけ 1 にします。

0000000000001011  = 11
0000000000001110  = 14
----------------
0000000000001010  = 10

上記では 11(0x000B) と 14(0x000E) の AND を取ると 10(0x000A) となります。プログラムで実際に記述する場合は次のようになります。

short int a = 0x000B;
a = a & 0x000E;

上記の演算の結果、変数 a には 10(0x000A) が格納されることになります。

ビットOR

ビット OR は演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットの少なくともどちらが一つが 1 の場合に 1 にします。

0000000000001011  = 11
0000000000001110  = 14
----------------
0000000000001111  = 15

上記では 11(0x000B) と 14(0x000E) の OR を取ると 15(0x000F) となります。プログラムで実際に記述する場合は次のようになります。

short int a = 0x000B;
a = a | 0x000E;

上記の演算の結果、変数 a には 15(0x000F) が格納されることになります。

ビットXOR

ビット XOR は演算子の左辺と右辺の同じ位置にあるビットを比較して、ビットの値がどちらか一つだけが 1 の場合に 1 にします。両方 0 だったり両方 1 だった場合は 0 にします。

0000000000001011  = 11
0000000000001110  = 14
----------------
0000000000000101  = 5

上記では 11(0x000B) と 14(0x000E) の XOR を取ると 5(0x0005) となります。プログラムで実際に記述する場合は次のようになります。

short int a = 0x000B;
a = a ^ 0x000E;

上記の演算の結果、変数 a には 5(0x0005) が格納されることになります。

ビットNOT

ビット NOT は演算子の右辺の値の各ビットに対して 1 の場合は 0 に、 0 の場合は 1 にします。

0000000000001011  = 11
----------------
1111111111110100  = -12

※ short int 型の値を 2 進数で 2 の補数表現で行った場合、最上位ビットが 1 の値は負の数となります。

上記では 11(0x000B) の NOT を取ると -12(0xFFF4) となります。プログラムで実際に記述する場合は次のようになります。

short int a = 0x000B;
a = ~a;

上記の演算の結果、変数 a には -12(0xFFF4) が格納されることになります。

サンプルコード

それでは簡単なサンプルを作成します。

#include <stdio.h>

int main(void){
  short int a = 11;
  short int b = 14;

  printf("%d AND %d = %d\n", a, b, a & b);
  printf("%d OR %d = %d\n", a, b, a | b);
  printf("%d XOR %d = %d\n", a, b, a ^ b);
  printf("NOT %d = %d\n", a, ~a);

  return 0;
}

テキストエディタでプログラムを記述したあと sample.c という名前で保存します。(文字コードは UTF-8(BOM付き) です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで最初にコンパイルを行います。

cl sample.c

ビット演算子(1)

コンパイルが終わりましたら、次のように実行してください。

sample

ビット演算子(2)

ビット演算子を使った演算結果を画面に出力しました。

-- --

C 言語におけるビット演算子の使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。