時間があるので、pythonの勉強でもしようかと思い、
で、勉強してたら、ビット演算子というものがでてきました。長年プログラミングをしていますが、ビット演算子は、まったく使ったことがないので、この機会にちょっと勉強してみました。
まずは、基本であるビットとは
コンピュータは、実は、ON/OFFの繰り返しでできており、そのON/OFFのスイッチをビットと読んでおり、スイッチ一個を1ビットとよびます。ちなみに、8ビットが1バイトです。表記するときは、0000000のように表し、右側から0ビット目、1ビット目って数えます。
次に、ビット演算とは
スイッチのON/OFFの切り替えを制御するのがビット演算です。大体8の倍数個、つまりバイト単位でまとめて行います。
それでは、演算子についてです。
ちょうど、pythonを勉強しているので、例は、pythonでやります。
演算子一覧
~a # ビット反転
a & b # AND:論理積
a | b # OR:論理和
a ^ b # XOR:排他的論理和
a << b # b ビット左シフト
a >> b # B ビット右シフト
&(AND)
2つを比較し、どちらも1なら1、それ以外なら0を返します。フラグをビット管理しているときに、そのフラグが立っているかを調べます。
例
a&b=c
a 11110000
b 10101010
↓
c 10100000
|(OR)
2つを比較して、どちらかが1なら1、それ以外なら0を返します。フラグをビット管理しているときに、そのフラグを立てるときなどにつかいます。
例
a|b=c
a 11110000
b 10101010
↓
c 11111010
~(NOT)
すべて逆転させます。1を0に、0を1に変えます。真逆の状態にしたいときに使います。
例
~a=c
a 11110000
↓
c 00001111
^(XOR)
2つを比較して、どちら片方だけ1ならば1、どちらも0またはどちらも1の場合は、0を返します。どこが違うか調べるときなどで使います。
例
a^b=c
a 11110000
b 10101010
↓
c 01011010
>>(右ビットシフト) >>(左ビットシフト)
>>は、ON/OFFの状態を右にずらします。
<<は、ON/OFFの状態を左にずらします。
ずらしたことによるできた空白には0がはいり、はみ出した分は消えます。このはみだして消えたことを、オーバーフローといいます。ループを使ってビット操作するときなどに使えます。
例
a >> 1 =c
a 11110000
↓
c 01111000
a << 1 =c
a 11110000
↓
c 1110000
以上です。
通常のプログラミングでは、ビット演算は使わなくてもいいですが、メモリの節約をするときなどにつかいます。例えば、一つの変数で複数のフラグを管理する場合です。もし、使える機会があったらつかってみてください