Page 25 ビット演算

OR演算

10進16進2進
422A101010
5133110011
計算後3B111011

OR演算はビットがどちらかのビットが立っていたらビットを立てる、どちらも立っていなかったら立てないという演算になります。

C言語では「|」演算子を使います。

#include <stdio.h>

int main(){
	printf("%x\n", 42 | 51);
	return 0;
}

なお、printfの「%x」は16進数表示すると言う意味です。

AND演算

10進16進2進
422A101010
5133110011
計算後22100010

AND演算はビットが両方のビットが立っていたらビットを立てる、片方しか立っていない、あるいは両方とも立っていなかった場合は立てないという演算になります。

C言語では「&」演算子を使います。

#include <stdio.h>

int main(){
	printf("%x\n", 42 & 51);
	return 0;
}

XOR演算

10進16進2進
422A101010
5133110011
計算後19011001

AND演算はビットが片方ののビットが立っていたらビットを立てる、両方立っていない、あるいは両方立っている場合はビットを立てないという演算になります。

C言語では「^」演算子を使います。

#include <stdio.h>

int main(){
	printf("%x\n", 42 ^ 51);
	return 0;
}

さて、これらの演算はどこで使うのでしょうか。

1バイトのデータ(char型)は8ビットですから、8個の0か1かのフラグを持たせられます。そのフラグの判定、フラグのON、OFFにこのビット演算が役に立ちます。

例えば、右から2ビット目のビットが立っているか立っていないかを判別する場合は、

	if((a & 0x02) == 0x02){

などというように書くことができます。0x02は16進数の2です。

2ビット目をONにするには、

	a = a | 0x02;

などとします。省略形で、「a |= 0x02」という表記も可能です。このようにすると、初めから2ビット目が立っている場合は何も行われず、2ビット目が立っていないときのみ2ビット目をONにするというビット操作ができます。

このビット演算では16進数がよく使われます。下の表を見ると16進数の場合は1、2、4、8、を繰り返すだけなので分かりやすいですね。

2進数10進数16進数
111
1022
10044
100088
100001610
1000003220
10000006440
1000000012880

なお、#defineでそれぞれのビットを定義して使用した方がわかりやすくなります。

#define BIT_0 0x01
#define BIT_1 0x02
/* ・・・など */

ビットシフト

右に2バイトシフトさせる、左に3バイトシフトさせる・・・という、情報処理試験によくでてきそうな処理です。

左に1ビットシフトさせるとは、例えば、10010を、100100とするような計算になります。

C言語では「<<」という演算子を使用します。

右に1ビットシフトさせるとは、例えば、10011を、1001とするような計算になります。

C言語では「>>」という演算子を使用します。

#include <stdio.h>

int main(){
	printf("%x\n", 0x100 >> 1);	/* 右に1ビット */
	printf("%x\n", 0x100 << 2);	/* 左に2ビット */
	return 0;
}

戻る