ビット演算入門
プログラムの基本であるビット演算ですが、はっきり言って知らなくても何とでもなります。
ですが、知っている事によってプログラムの選択肢を広げる事ができ、実際に使うと便利な場面もあります。
さらにビット演算は多くのコンピューター言語で使用する事ができるため、一度覚えれば様々な環境で使う事ができます。
本稿ではビット演算を知らない人向けに、ビット演算がどんな物であるかと簡単な実例を解説します。
ビット演算とは
まずビット(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
まとめ
以上がビット演算の基本になります。
これらを組み合わせる事により、単なる+-×÷ではできないようなコンピューター特有の計算をする事ができます。
実際に使いだすと、変数が何バイトなのか等気にする事も多いですが、オーバーフローを意図的に使ったりと工夫のし甲斐があります。
世の中はビットコインで白熱していますが、たまにはビット演算の事も思い出してくださいね!