ビットとは?

ビットとは、0または1しか持てない数字の単位で、コンピューターでよく使われます。
ビットは0と1しか表現できません。では、数字の2はどうやって表現したらよいでしょうか?

答えは、10 です。

3 → 11
4 → 100
5 → 101

と表記します。

私たちが普段使っている数字の計算は、9を超えたら桁が上がりますよね。
9を超えたら桁が上がる計算方法を十進数と言います。
私たちは、普段から十進数を使って計算をしているのです。

しかし、ビットは、0か1で全ての数字を表さないといけません。
ですので、2になったら桁を一つ上げ、10として表現するのです。
このように、各位の数字が1を超えたら桁が上がる計算方法を二進数と言います。

先ほども述べたように、ビットは、0と1で全ての数字を表します。
つまり、ビットを数字を表現する時は、二進数で表現することになるのです。

スポンサーリンク

バイトとは?

コンピューターの世界では、ビットとともにバイトと呼ばれる単位も頻繁に使われます。
パソコンのハードディスクやメモリの容量など、パソコンを買ったことがあれば、あなたも聞いたことがあるのではないでしょうか。

バイトとは、ビットの塊のことで、1バイトは8ビットで構成されます。
1バイトをビットで表記すると

00000000

となります。
8ビットなので、0を8個並べれば1バイトが表現できます。

では、1バイトはいくつの数字まで持つことができるでしょうか? 1バイトの最大数を二進数で表記すると

11111111

となりますよね。
お気づきかもしれませんが、二進数は桁が上がると 2nをすることになります。

00000001 → 20 = 1
00000010 → 21 = 2
00000100 → 22 = 4
00001000 → 23 = 8
00010000 → 24 = 16
00100000 → 25 = 32
01000000 → 26 = 64
10000000 → 27 = 128

1バイトの最大数は、これらを全て足し算すれば計算することができるので、

128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

ということになります。
以上が、ビットとバイトの説明になります。
では、ビットとバイトの知識を踏まえてビット演算のサンプルプログラムを見てみましょう。

サンプルプログラム

ソースファイル名:main.c

実行方法

上のソースを書き写してステップ実行してください。
一つ一つの命令が過ぎた時の a の値と b の値を
比較してみてください。

ビット演算はどんな時に使うの?

ビット演算は、プログラム特有の計算です。
ビット単位で計算をしたい時に使います。
では、どんな時にビット演算を使うのでしょうか?

フラグと呼ばれる言葉を聞いたことはないでしょうか?
フラグとは、ある状態になっているかどうかを判定するサインのことで、このフラグを表すのにビット演算を使うことが多くあります。

ゲームではとてもよく使います。
例えば、変数 story の 0 ビット目が1なら、オープニングは終わっている、などストーリーの進捗判定など用途は多岐にわたります。

慣れるまではなかなか使うことは少ないですが、覚えておくととても役に立つのでぜひ覚えましょう。

論理和

論理和は "or" と言います。
"a と b を or する"と言ったりします。

論理和とは、どちらか一方のビットが 1 なら 1 とするビット演算です。
例を見てみましょう。

	// ① 論理和 or
	b = 0x0f;
	a = b | 0x00f0;

or をする時は、「|」という記号を使います。
サンプルプログラムの①では、これにより b と 2 を or しています。

以下が or の計算方法です。
b は 1 なので二進数で表すと

00000001

2 は、

00000010

となります。
二つの二進数を縦に並べます。

00000001
00000010

上と下の各ビットを見比べて、どちらか一方が 1 なら 1 とします。
一番右のビット(赤字)を例に取ると、1 と 0 なので、1 となります。
右から二番目も同じです。その要領で一番左のビットまで繰り返します。
今回の結果、a は、

00000011

が入ります。十進数で表すと、3 です。
これが論理和( or )です。

論理積

論理積は "and" といいます。
"a と b を and する"とよく言います。

論理積とは、両方のビットが 1 の時のみ 1 になるというビット演算方法です。
サンプルプログラムの②では

	// ② 論理積 and
	b = 1;
	a = b & 3;

上の「&」の部分が論理積にあたります。
and をする時は、「&」という記号を使います。
これにより b と 3 を and してくれます。

計算の手順は or と同じです。
両者を二進数で表します、b は 1 なので、

00000001

3 は、

00000011

となります。 これを縦に並べます。

00000001
00000011

上と下の各ビットを見比べて、両者が 1 なら 1 とします。
一番右のビット(赤字)を例に取ると、1 と 1 なので、1 となります。
右から二つ目のビットは、0 と 1 なので、0 となります。

今回の結果、a は、

00000001

となります。十進数で表すと 1 です。
これが論理積( and )です。

排他的論理和

排他的論理和は "xor" といいます。
"a と b を xor する"とよく言います。

排他的論理和とは、両方のビットが異なる時 1 になるビット演算方法です。

サンプルプログラムの③では、

	// ③ 排他的論理和 xor
	b = 3;
	a = b ^ 2;

上の「^」の部分が排他的論理和にあたります。
xor をする時は、「^」という記号を使います。
今回は b と 2 を xor しています。

計算の手順は or や and と同じです。
両者を二進数で表します、b は 3 なので、

00000011

2 は

00000010

となります。
これを縦に並べます。

00000001
00000010

上と下の各ビットを見比べて、両者が異なったら 1 とします。
一番右のビット(赤字)を例に取ると、1 と 0 なので、1 となります。
右から二つ目は、1 と 1 なので、0 となります。

今回の結果、a は、

00000001

が入ります。十進数で表すと 1 です。
これが排他的論理和( xor )です。

便利な排他的論理和

排他的論理和は、ゼロクリアをする時に使えます。

	b = 15;
	b = b ^ b;

上のプログラムを実行すると、

b = b ^ b;

の部分は、

b = 0;

と同じになります。
実際に計算してみましょう。

b は 15 なので、二進数で表すと

00001111

となります。
b ^ b を縦に書いて計算してみます。

00001111
00001111

xor は、両者が同じなら 0 になります。
よって、見ても明らかなように、結果は全ビット 0 になります。
つまり、

b = 0;

と同じ結果が得られます。

この計算は、b = 0 よりも処理スピードが速くなります。
処理速度が必要な時は有効な手段になるでしょう。

ビット反転

最後はビットの反転です。

	// ④ ビット反転
	b = 0x01;
	a = ~b;

ビット反転をする時は、「~」 という記号を使います。
これを使うと b のビットを反転した数字を a に入れてくれます。

今回の例だと、b は 1 で二進数で表すと、

00000001

となります。 これらのビットを全て反転すると

11111110

となり、十進数で表すと 254 となります。

スポンサーリンク