サイトマップ / C言語講座出入り口総目次目次:ビット演算>ビットシフト

青い直線

ビットシフト

青い直線

[ある時刻からの経過時間]←このソース→[ビット毎の論理積と論理和]

/* バイトとビット */

/* コンピュータはバイト単位でデータを読み書きします。1960 年代には、1 バイトが 7 ビットや 9 ビットのマシンが存在していました。その後 1 バイトは 8 ビットに統一されています。1 バイトの構造を下記に示します。

ビット 7 6 5 4 3 2 1 0

一番左のビットを最上位ビット ( MSB: Most Significant Bit )、一番右のビットを最下位ビット ( LSB: Least Significant Bit ) と呼びます。

各ビットには 0 か 1 が入ります。その様子を表したものを、ビットパターンといいます。

unsigned char 型のデータは1バイトです。0 から 255 迄の 256 通りのデータを表すことができます。unsigned char 型のデータがビットパターンでどのように表現されるかを、下記に示します。

10進数 ビットパターン
0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1
2 0 0 0 0 0 0 1 0
3 0 0 0 0 0 0 1 1
4 0 0 0 0 0 1 0 0
5 0 0 0 0 0 1 0 1
6 0 0 0 0 0 1 1 0
7 0 0 0 0 0 1 1 1
8 0 0 0 0 1 0 0 0
16 0 0 0 1 0 0 0 0
32 0 0 1 0 0 0 0 0
64 0 1 0 0 0 0 0 0
128 1 0 0 0 0 0 0 0
255 1 1 1 1 1 1 1 1

10 進数で 1 2 4 8 16 32 64 128 のビットパターンにに注目して下さい。数字が 2 倍になると、1 が 1 ビット左へ移動しています。このことを 1 ビット左へシフトするといいます。数字が 1 / 2 になると 1 ビット右へシフトします。2 ビット右へシフトさせれば、1 / 4 になります。

ビット演算子

ビットを直接操作する演算子があります。ビット演算子といいます。'<<'左シフト'>>' は右シフトさせるビット演算子です。この演算子のことを、シフト演算子と呼びます。

算術演算子を使って 2 倍したり、 1 / 2 倍するのに比較すると、はるかに高速です。

c が unsigned int 型の整数とすると、この演算子は下記のように使います。

    c = c << 1;    // 1 ビット左へシフト
    c = c >> 2;    // 2 ビット右へシフト

今回のソースプログラムでは、unsigned int 型の整数 c に 1 を代入し、1 ビットずつ左へシフトさせながら、10 進表示、8 進表示、16 進表示させます。 */

/* ここからソースプログラム */

#include  <stdio.h>

void main(void);

void main(void)
{
    int i;
    unsigned char c = 0X01;        /* c に 16 進数の 1 を代入 */

    printf("10 進表示 8 進表示  16 進表示\n");
    for (i = 0; i < 8; i++) {
        printf("c = %3d   c = %#04o  c = %#04x\n", c, c, c);
        c = c << 1;               /* 1 ビット左シフト */
    }
}

/* こ こまでソースプログラム */

[ある時刻からの経過時間]←このソース→[ビット毎の論理積と論理和]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ビット演算>ビットシフト