ビット演算

読み:びっとえんざん / 英語表記:bitwise operation

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を入れ替える
ABA AND BA OR BA XOR B
00000
01011
10011
11110

マスクとしての使い方

ビット演算は、ある値の一部のビットだけを操作する「マスク」の処理に使われる。

やりたいこと演算理由
特定のビットだけを取り出すANDマスクが0のビットは必ず0になり、1のビットは元の値が残る
特定のビットを1にするORマスクが1のビットは必ず1になり、0のビットは元の値が残る
特定のビットを反転させるXORマスクが1のビットは反転し、0のビットは元の値が残る

IPアドレスの計算への応用

IPアドレスを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をとる)などに使われている。

実際の試験ではここに出る!

この用語が出てくる記事

↑