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