IT技術に関する情報掲載サイト

プログラミングに関することを掲載します。

Python入門とビット演算

時間があるので、pythonの勉強でもしようかと思い、

とほほのPython入門 - とほほのWWW入門

で、勉強してたら、ビット演算子というものがでてきました。長年プログラミングをしていますが、ビット演算子は、まったく使ったことがないので、この機会にちょっと勉強してみました。

まずは、基本であるビットとは

コンピュータは、実は、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

 

以上です。

 

通常のプログラミングでは、ビット演算は使わなくてもいいですが、メモリの節約をするときなどにつかいます。例えば、一つの変数で複数のフラグを管理する場合です。もし、使える機会があったらつかってみてください