今回は、コンピューターの基礎と言えるビット処理演算子を説明したいと思います。
今の私にとっては簡単な計算ですが、初心者の頃、学校の数学しか知らなかったので、理解に苦しみました。(^^;
まず、コンピューターで重要なのが数値の扱い方です。
コンピューターでは一般的に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で頑張っていました。
データの使用量を最小限にするには、これほど便利な命令はありません。(^^)
以上