LoginSignup
228
202

More than 5 years have 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

まとめ

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

228
202
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
228
202