ビット演算
2進数の各ビットに対して、桁ごとに論理演算を行うこと。論理積(AND)、論理和(OR)、排他的論理和(XOR)、ビット反転(NOT)などがある。
イマシルちゃんの解説
0と1だけでできた数どうしを、1桁ずつ組み合わせて計算するのがビット演算なんだ。
ANDは「両方1なら1」、ORは「どっちか1なら1」、NOTは「0と1をひっくり返す」。
シンプルなルールだけど、ネットワークのアドレス計算では大活躍するんだよ!
たとえばANDを使うと、型紙みたいに、必要な部分だけを切り取ることができるんだ。
より深い解説
定義
ビット演算は、整数を2進数のビットの並びとして扱い、同じ位置のビットどうしで論理演算を行う演算である。桁上がりがないため、各ビットの結果は、そのビットだけで決まる。
主なビット演算
| 演算 | 記号の例 | 規則 |
|---|---|---|
| 論理積(AND) | & | 両方が1のときだけ1 |
| 論理和(OR) | | | どちらかが1なら1 |
| 排他的論理和(XOR) | ^ | 2つが異なるときだけ1 |
| ビット反転(NOT) | ~ | 0と1を入れ替える |
| A | B | A AND B | A OR B | A XOR B |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
マスクとしての使い方
ビット演算は、ある値の一部のビットだけを操作する「マスク」の処理に使われる。
| やりたいこと | 演算 | 理由 |
|---|---|---|
| 特定のビットだけを取り出す | AND | マスクが0のビットは必ず0になり、1のビットは元の値が残る |
| 特定のビットを1にする | OR | マスクが1のビットは必ず1になり、0のビットは元の値が残る |
| 特定のビットを反転させる | XOR | マスクが1のビットは反転し、0のビットは元の値が残る |
IPアドレスの計算への応用
IPアドレスをa、サブネットマスクをmとすると、次のように求められる。
| 求めるもの | 式 |
|---|---|
| ネットワークアドレス | a & m |
| ホスト部の値 | a & ~m |
| ブロードキャストアドレス | a | ~m |
たとえば第4オクテットが a = 10110101(181)、m = 11110000(240)なら、
a & m = 10110000(176) … ネットワーク部だけが残る
~m = 00001111(15)
a & ~m = 00000101(5) … ホスト部だけが残る
a | ~m = 10111111(191) … ホスト部がすべて1になる
演算子の優先順位
式を読むときは、演算子の優先順位に注意する。多くのプログラミング言語(C言語など)では、ビット反転(~)がAND(&)やOR(|)より優先される。そのため、a & ~m は a & (~m) と解釈される。AND と OR の間では、ANDのほうが優先されるのが一般的である。
シフト演算
ビットの並びを左右にずらすシフト演算もビット演算の一種である。
| 演算 | 効果 |
|---|---|
| 左シフト(<<) | 1ビットずらすごとに値が2倍になる |
| 右シフト(>>) | 1ビットずらすごとに値が2分の1になる(論理シフトでは、空いたビットに0が入る) |
XORの性質
XORには、同じ値で2回演算すると元に戻る(A XOR B XOR B = A)という性質がある。この性質は、RAID 5のパリティによるデータの復元や、簡単な暗号化(ストリーム暗号で、平文と鍵ストリームのXORをとる)などに使われている。