C言語講座 - 16進数 + シフト演算 + ビット演算

ビット演算は、少し難しいですがこれを使えるのとバイナリを自由自在に操作できるようになるので 是非覚えておいた方が良いと思います。

ビット演算をするときの基本は 2進数 と 16進数です。 2進数は 0 と 1 だけで表されるもので、16進数の数字をわかりやすく見ることが出来ます。 16進数は 0〜9に A〜F を加えた 16種の字で表されるもので、先頭には 0x がついています。 そして 16進数は、16になったときに桁が一つ繰り上がり、2進数は 2 で繰り上がります。

ビットというのは、データの一番基本になる単位で、「8ビット=1バイト」になります。 1ビットには「1」まで、1バイトには「255、11111111、0xFF」までの数値が格納できます。

一番右は2進数で表したもので、これをみると1バイトが8ビットで構成されているのが分かると思います。 つまり2進数での一桁が、1ビットにあたります。そしてビット演算とはこのビット単位で演算します。

10進数2進数16進数
0 00x0
1 10x1
2 100x2
4 1000x4
810000x8
1010100xA
1511110xF

10進数2進数16進数
16 100000x10
32 1000000x20
100 11001000x64
255 111111110xFF
256 1000000000x100
512 10000000000x200
1024100000000000x400

int i = 2, j = 0xFF;

...

i = i << 2; /* 2ビット左シフト : 4倍 */
j >>= 2; /* 2ビット右シフト : 4分の1 */

「シフト演算」とは、指定された方向に、指定された数だけ「ビットを移動する」処理です。 これが一体何の役に立つかというと、有名なものでは「左シフト一回で2倍、右シフト一回で0.5倍」というのがあります。

「>>」は、指定されたビット数だけ右シフトします。 「<<」は、指定されたビット数だけ左シフトします。


flag |= 0x05; /* 1、3番目のビットを1にする (0x05:00000101) */

if(flag & 0x01) printf("1"); else printf("0");
if(flag & 0x02) printf("1"); else printf("0");
if(flag & 0x04) printf("1"); else printf("0");
if(flag & 0x08) printf("1"); else printf("0");
printf("\n");

flag ^= 0x01; /* 1番目のビットを消去 */

「ビット演算」は、データをビット単位で処理するもので、「AND」「OR」「XOR」「NOT」があります。 この演算は、二つの数値間で行われます。(「NOT」だけは例外で一つの数値に使う)。

「AND」は、二つの数値のビットを比較して「両方1ならば1」を出す演算です。 これは、特定のデータだけを取り出したいときなどに使えます。

「OR」は、二つのビットを比較して「片方でも1ならば1」を出す演算です。 これはANDと逆に、データを埋め込みたいときなどに使えます。

「XOR」は、二つのビットを比較して「両方1ならば0。片方1ならば1。」を出す演算です。 これは、埋め込まれたデータの消去などに使えます。 また、画像ファイルのデータ(あるいはパレット)の全ビットを1でXORすると色を反転させることができます。

数値1(2進数)数値2(2進数) AND[&]OR[|]XOR[^]
00000
01011
11110
1111111100100010001000101111111111011101
0101010110101010000000001111111100000000
0000111100001111000011110000111100000000
0000000011011001000000001101100111011001
Download 今回のソースDownload


★TOP★

Copyright(C) へぽぽ