サイトマップ / 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 ビットが立っている。
ある数 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 ビットが立っていない。
ある数 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 ビットが立っている。
ある数 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 ビットが立っていない。
ある数 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言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ビット演算>ビット毎の論理積と論理和