10進 | 16進 | 2進 | |||||
---|---|---|---|---|---|---|---|
42 | 2A | 1 | 0 | 1 | 0 | 1 | 0 |
51 | 33 | 1 | 1 | 0 | 0 | 1 | 1 |
計算後 | 3B | 1 | 1 | 1 | 0 | 1 | 1 |
OR演算はビットがどちらかのビットが立っていたらビットを立てる、どちらも立っていなかったら立てないという演算になります。
C言語では「|」演算子を使います。
#include <stdio.h> int main(){ printf("%x\n", 42 | 51); return 0; }
なお、printfの「%x」は16進数表示すると言う意味です。
10進 | 16進 | 2進 | |||||
---|---|---|---|---|---|---|---|
42 | 2A | 1 | 0 | 1 | 0 | 1 | 0 |
51 | 33 | 1 | 1 | 0 | 0 | 1 | 1 |
計算後 | 22 | 1 | 0 | 0 | 0 | 1 | 0 |
AND演算はビットが両方のビットが立っていたらビットを立てる、片方しか立っていない、あるいは両方とも立っていなかった場合は立てないという演算になります。
C言語では「&」演算子を使います。
#include <stdio.h> int main(){ printf("%x\n", 42 & 51); return 0; }
10進 | 16進 | 2進 | |||||
---|---|---|---|---|---|---|---|
42 | 2A | 1 | 0 | 1 | 0 | 1 | 0 |
51 | 33 | 1 | 1 | 0 | 0 | 1 | 1 |
計算後 | 19 | 0 | 1 | 1 | 0 | 0 | 1 |
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進数 |
---|---|---|
1 | 1 | 1 |
10 | 2 | 2 |
100 | 4 | 4 |
1000 | 8 | 8 |
10000 | 16 | 10 |
100000 | 32 | 20 |
1000000 | 64 | 40 |
10000000 | 128 | 80 |
なお、#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; }