コンピューター数学の基礎、ビット処理演算子

今回は、コンピューターの基礎と言えるビット処理演算子を説明したいと思います。

今の私にとっては簡単な計算ですが、初心者の頃、学校の数学しか知らなかったので、理解に苦しみました。(^^;

まず、コンピューターで重要なのが数値の扱い方です。
コンピューターでは一般的に2進数、4進数、8進数、10進数、16進数で数値を扱います。

2進数は、0と1、つまりオフとオンで数値を表現します。
10進数は、一般的に使われている0~9までの数値で数字を表現します。
16進数は、0~9、A~Fにより、0~15までの数字を表現します。


10進数
2進数
16進数
0
0
0
1
1
1
2
10
2
3
11
3
4
100
4
10
1010
A
15
1111
F
16
10000
10
255
11111111
FF

次に、コンピューターでは一度に扱うことが出来る数値の量があります。
例えば、16ビットコンピューターでは、0x0000~0xFFFFまでの数値を扱うことが出来ます。
32ビットコンピューターでは、0x00000000~0xFFFFFFFFまでの数値を扱うことが出来ます。
64ビットコンピューターでは、0x0000000000000000~0xFFFFFFFFFFFFFFFFまでの数値を扱うことが出来ます。


使用例
ビット C++ アセンブラ
16ビット short val;
val=10;
mov al, 10
32ビット int val;
val=10;
mov eax, 10
64ビット long long val;
val=10;
mov rax, 10

コンピュータには、and, or, xor, not等のビット処理演算子があります。
andは、2つの数値から一致するビットを1にします。
orは、2つの数値から有効なビット(1のビット)を組み合わせます。
xorは、2つの数値から一致しないビットを1にし、一致するビットを0にします。
notは、ビットの1と0を反転します。

これらの演算子は、次のように扱います。


ビット処理演算子
計算元1
計算元2
結果
and
0x1248

(0001001001001000)
0x1048

(0001000001001000)
0x1048

(0001000001001000)
or
0x1248

(0001001001001000)
0x2000

(0010000000000000)
0x3248

(0011001001001000)
xor
0x1248

(0001001001001000)
0x1048

(0001000001001000)
0x0200

(0000001000000000)
not
0x1248

(0001001001001000)
なし
0xEDB7

(1110110110110111)

※カッコ外の数値は、16進数。
※カッコ内の数値は、2進数。

アセンブラで表現すると、次のようになります。


mov	eax, 00FFFFFFH	;EAX = 00FFFFFF
and	eax, 00100000H	;EAX = 00100000
or	eax, 80000000H	;EAX = 80100000
mov	ebx, 80000000H	;EAX = 80100000, EBX = 80000000
xor	ebx, eax	;EAX = 80100000, EBX = 00100000
not	eax		;EAX = 7FEFFFFF, EBX = 00100000

昔のパソコンは、今ほど大きなメモリを搭載しておらず、640MBで頑張っていました。

データの使用量を最小限にするには、これほど便利な命令はありません。(^^)

以上