Java
PHP
C
JavaScript

ビット演算入門

プログラムの基本であるビット演算ですが、はっきり言って知らなくても何とでもなります。
ですが、知っている事によってプログラムの選択肢を広げる事ができ、実際に使うと便利な場面もあります。
さらにビット演算は多くのコンピューター言語で使用する事ができるため、一度覚えれば様々な環境で使う事ができます。
本稿ではビット演算を知らない人向けに、ビット演算がどんな物であるかと簡単な実例を解説します。

ビット演算とは

まずビット(bit)とは何か?

コンピューターは無数のON/OFFのスイッチの集合体で、このスイッチの事をビットと呼び、スイッチ1個を1ビットと呼びます。
そしてこのスイッチは8個セットで運用されており、この8個のグループの事をバイト(byte)と呼び、グループ1組で1バイトです。
プログラムは0と1の集合体だと話を聞いた事があるかもしれませんが、ここから来ています。
表記するときには00000000のように表記し、右側から0ビット目、1ビット目...とカウントしていきます。
※1からカウントする事も多々あるので注意

ビット演算とは

無数のスイッチのON/OFFの切り替えを制御するのがビット演算です。
ON/OFFと一言で済んでしまいますが、様々なシチュエーションの為に複数の命令が用意されています。

そしてON/OFFの制御ですが、基本的に8の倍数個をまとめて行います。
つまりバイト単位です。
各言語で1バイト変数・2バイト変数など様々ありますが、その変数全てのバイト全てにまとめて命令を出す形になります。

演算子

演算子とは+や-などの計算する時に使う計算記号の事です。
ビット演算は数学では使用しない特殊な計算記号で、6つあります。
基本的に帰ってくる結果は1ビット目同士・2ビット目同士と順にチェックしていき、その結果が1ビット目・2ビット目に結果がそれぞれ入ります。

&(AND)

2つスイッチを比較して、どちらも1なら1、どちらか片方でも0の場合は0を返します。
フラグをビット管理している時に、そのフラグが立っているのかを調べたりするのに使います。
例:c = a & b
a 11110000
b 10101010
  ↓
c 10100000

|(OR)

2つスイッチを比較して、どちらかが1なら1、どちらも0の場合は0を返します。
フラグをビット管理している時に、そのフラグを立てる時などに使います。
例:c = a | b
a 11110000
b 10101010
  ↓
c 11111010

!(NOT)※~の場合も

スイッチのON/OFFの状態をすべて逆転させ、0は1に、1は0に変えます。
真逆の状態にしたいときに使います。
例:c = !a
a 11110000
  ↓
c 00001111

^(XOR)

2つスイッチを比較して、どちか片方だけ1なら1、どちらも0またはどちらも1の場合は0を返します。
どこが違うか調べるときなどで使います。
例:c = a ^ b
a 11110000
b 10101010
  ↓
c 01011010

>>(右ビットシフト)

スイッチのON/OFFの状態を、右に1個ずらします。
ずらした事により空いた枠には0が入り、決められた桁数からはみ出た分は消えます。
このはみ出たらら消える事を、オーバーフローと呼びます。
ループを使ってビット操作するときになど使います。
記:c = a >> 1
a 11110000
  ↓
c 01111000

<<(左ビットシフト)

スイッチのON/OFFの状態を、左に1個ずらします。
こん部分以外は右ビットシフトとほぼ同じです。
記:c = a >> 1
a 11110000
  ↓
c 11100000

まとめ

以上がビット演算の基本になります。
これらを組み合わせる事により、単なる+-×÷ではできないようなコンピューター特有の計算をする事ができます。
実際に使いだすと、変数が何バイトなのか等気にする事も多いですが、オーバーフローを意図的に使ったりと工夫のし甲斐があります。
世の中はビットコインで白熱していますが、たまにはビット演算の事も思い出してくださいね!