サイトマップ / C言語講座>出入り口>総目次>目次:ビット演算>ビット毎の論理積と論理和
/* 前回はビット演算子のうち、シフト演算子について学びました。今回は、ビット毎の論理積 ( & ) と論理和 ( | ) について学びます。
下記に示すのは、前回学んだビットパターンです。各ビットには 0 か 1 が入るので 1 ビットで二つの状態を表すことができ、8 ビットで、256 通りの状態を表すことができます。
ビット | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
例えば、第 1 ビットに 1 が入っているとすると、第 1 ビットが立っているという言い方をします。ある数の第 1 ビットが立っているかどうかを調べる時、論理積 ( & ) 演算子を使います。
a = ある数 & 0X02;
上記の演算を行って a が 0 なら、第 1 ビットは立っていません。0 以外なら、第 1 ビットは立っています。これをビットパターンで表すと下記のイメージになります。
ある数 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
& | ||||||||
2 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
= | ||||||||
a | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
ある数 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
& | ||||||||
2 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
= | ||||||||
a | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
ある数の第1ビットを立てるには、論理和 ( | ) を使います。
a = ある数 | 0X02;
これをビットパターンで示すと、下記のようになります。
ある数 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
| | ||||||||
2 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
= | ||||||||
a | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
ある数 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
| | ||||||||
2 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
= | ||||||||
a | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
ビットを操作する際、下記の 16 進数を使うと便利です。ビットパターンとともに示します。
10進数 | ビットパターン | 16進表現 | |||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0X00 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0X01 |
2 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0X02 |
4 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0X04 |
8 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0X08 |
16 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0X10 |
32 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0X20 |
64 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0X40 |
128 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0X80 |
今日は幾つかのビットを立てて、それを関数に渡し、関数の方では、どのビットが立っているか調べ、それにより異なる処理をする関数を作ります。今回の関数は簡単なものですが、この方法は応用範囲が広く、実用的なプログラムを作る時、役に立ちます。覚えておくと良いでしょう。 */
#include <stdio.h> #define BLACK 0X01 /* 第 0 ビットを立てるのに使う */ #define WHITE 0X02 /* 第 1 ビットを立てるのに使う */ #define OTHER 0X08 /* 第 3 ビットを立てるのに使う */ void ShowColor(unsigned char c); void main(void); void ShowColor(unsigned char c) { if ((c & BLACK) && (c & WHITE)) /* 両方のビットが立っていたら */ printf("灰色\n"); else if (!(c & BLACK) && (c & WHITE)) /* WHITE のビットのみ立っていたら */ printf("白\n"); else if ((c & BLACK) && !(c & WHITE)) /* BLACK のビットのみ立っていたら */ printf("黒\n"); else /* どちらでもなければ */ printf("????\n"); } void main(void) { printf("ShowColor(WHITE);\n"); ShowColor(WHITE); printf("ShowColor(BLACK);\n"); ShowColor(BLACK); printf("ShowColor(WHITE | BLACK);\n"); ShowColor(WHITE | BLACK); printf("ShowColor(OTHER);\n"); ShowColor(OTHER); } |
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−