Edited at

ビット演算入門

More than 1 year has passed since last update.


ビット演算入門

プログラムの基本であるビット演算ですが、はっきり言って知らなくても何とでもなります。

ですが、知っている事によってプログラムの選択肢を広げる事ができ、実際に使うと便利な場面もあります。

さらにビット演算は多くのコンピューター言語で使用する事ができるため、一度覚えれば様々な環境で使う事ができます。

本稿ではビット演算を知らない人向けに、ビット演算がどんな物であるかと簡単な実例を解説します。


ビット演算とは


まずビット(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


まとめ

以上がビット演算の基本になります。

これらを組み合わせる事により、単なる+-×÷ではできないようなコンピューター特有の計算をする事ができます。

実際に使いだすと、変数が何バイトなのか等気にする事も多いですが、オーバーフローを意図的に使ったりと工夫のし甲斐があります。

世の中はビットコインで白熱していますが、たまにはビット演算の事も思い出してくださいね!