ビット演算

ビット

ビット演算とは、「ビットの塊」単位で論理演算を行うめの演算操作のことです。

ビット演算を用いることで、乗除算では幾重にも重なった処理により、多くの時間を要したもののビット演算なら最短サイクルで処理が可能。これにより、高性能な機械語コーディングではビット演算はかなり重要視されるテクニックとなっています。

苦手意識を持たれがちなビット演算ですが、しっかり使いこなしてプログラミング効率を上げていきましょう。

※本ページにはPRが含まれます。

ビット演算のメリット

複雑なプログラムにおいて、処理や格納データが多くなることは、往々にしてよくあることです。

複雑にからみあったプログラム=スパゲッティプログラムを組むと、後任者の作業能率を下げるなど様々なデメリットがあります。

ビット演算をうまく使うことで、データ量の削減、処理速度の向上も狙うことができます。また、「一つのデータ内に復数の情報を入れることができる」という、上級者のテクニックを駆使することが可能です。

ビット演算子

ビット演算を行うためには、ビット演算子を使用することになります。主に利用されるビット演算子を一つずつみていきましょう。

NOT

一番単純でわかりやすいビット演算子が、この「NOT」です。この演算子が行う処理は単純、「すべてのビットを反転させる」といったもの。

記述例NOT 0111
= 1000

各ビットの値が「1」だった時は「0」に、「0」だった時は「1」にするのがこのビット演算子です。

OR

ORの演算子は、左辺と右辺の同じ位置のビットを比較して、どちらかが「1」だった時「1」に、つまりビットをONにします。

記述例0101
OR 0011
= 0111

ONにしたいビットを1に。そのままの状態にしておきたいビットは「0」のままにしておきましょう。

XOR

XORの演算子が行うのは「一部のビットを反転させる」というもの。一部のビットを反転させるので、NOTと上手に使い分けていきたいところです。

入力するビットの値が違う場合、ビットの値は「1」となります。

記述例0101
OR 0011
= 0111

AND

ANDの演算子が行うのは、ビットをOFFにするというもの。

OFFにしたいビットは「1」に。動かしたくないビットは「0」としておきましょう。

ビットをどうしたいかでビット演算子を選ぶ

ビット演算子の種類は多岐に渡って、実際に利用する際少し迷ってしまうかもしれませんが、実際にビット演算子を選ぶ際に大事なことは「何をしたいか」ということです。

ビットをまとめて反転させたいのか、一部のビットのみを反転させたいのか、一部のビットのみONにしたいのか、一部のビットをOFFにしたいのか、それにより使用するビット演算子は変わります。

最近のプログラムではビット演算が活躍する場面が減っている

と、ここまでビット演算とビット演算子の説明をしてきましたが、実は近頃ビット演算が活躍する場面は減っています。

なぜなら、最近はデータ容量を抑える工夫をせずとも、大容量のデータを扱う技術が向上しているからです。最近このビット演算が利用されるケースといえば、最高速の演算処理が必要なケース。例えばOSの近くで行われる処理などの場合です。

または、暗号化処理など、処理のスピードが最優先されるケースのみ。

しかしもちろんそれ以外の場面でも処理の高速化は目指すべきところ。プログラミングの技術としては、取り入れていって損はありません。処理の高速化、そしてメモリ容量の節約も可能です。

ビットシフト

ビットシフトとは、2進数のビットをそのまま左右にシフトさせる処理のことです。空いたビットには0が埋め込まれます。
<<を入力することで左にビットがシフト。
>>で右にビットをシフトします。
右にシフトすることで、実質2で除算した結果と同じ結果になり、左にシフトして2で乗算した結果と同じになります。

通常に除算、乗算するよりも高速の処理が可能となるため、処理動作の効率化が可能となります。

まとめ

ビット演算とは、ビット演算子を用いてビットの処理を行う計算式。

ビット演算を行うことで、あまり多くのデータを用いることなく、複雑な処理も必要なくデータ処理を簡素化して行うことが可能です。

しかし最近は大容量のデータを扱うことが可能となっており、ビット演算が活躍する場面は少なくなったと言われています。