【Python 入門】数値③ ビット演算子

Pythonには他の言語のようにビット演算子が用意されており、これによりビット演算が可能になっております。プログラムに慣れていない人には聞きなれない演算子だと思いますので、ビット演算とは何かというところからビット演算子使い方まで取り上げていきます。

ビット演算とは

ビットについて

ビット演算を語る前にまずビットとは何かというところを簡単に記載いたします。ビットとは情報の最小単位のことであり、0か1、つまり2進数で表します。この0と1が表す意味はスイッチONになっているかOFFになっているかをイメージするとよいです。スイッチがONであれば1、OFFであれば0となります。

ビットは8個を一つの組として使用され、この8個セットの事を1バイトといいます。

ビット演算子について

ビット演算子はこのビットを制御するための演算子の事を言います。

例えばビット演算子の中に「AND」演算子がありますが、これは入力から両方とも1が流れてきたら1を流し、どちらか一方が0であれば0を返す演算子です。

ビット演算子の使い方

それではビット演算子の使い方について確認していきます。また例によって最初に早見表を載せておきます。

演算名 対応記号 計算式
ビット反転 ~ ~a
AND(論理積) & a & b
OR(論理和) | a | b
XOR(排他論理和) ^ a ^ b
左シフト << a << b
右シフト >> a >> b

また、2進数であることを表すために整数の値の前にプレフィックスという符号を追加します。2進数は「0b」です。今回は扱いませんが、8進数であれば「0o」、16進数であれば「0x」です。

ビット反転

ビット反転は他の言語ではビットを0であれば1に、1であれば0に反転させるのですが、Pythonでは「~a」の場合、「-(a+1)」となる値を返します。記号は前述したように「~」を使います。例えば変数aが3であった場合~aは-4になります。

AND(論理積)

ANDは上記で紹介したように、両方の入力が1なら1、どちらか一方が0なら0を返します。記号は「」です。例えば「0b11 (3の値)」と「0b10 (2の値)」のANDを取ると1桁目は両方とも1なので1を返し、2桁目は一方が1でもう一方が0なので0を返します。したがって「0b10 (2の値)」になります。

上記で使用しているbin関数は与えられた値を2進数表現の文字列で返す変数です。なのでビットの値を渡せばそのまま文字列として表示してくれます。

OR(論理和)

ORは2つの入力のうち、どちらか一方が1であれば1を返し、両方とも0であれば0を返します。記号は「」を使います。この記号はパイプと読みます。

「0b11 (3の値)」と「0b10 (2の値)」のANDを取ると1桁目は両方とも1なので1を返し、2桁目は一方が1でもう一方が0なので1を返します。したがって「0b11 (3の値)」になります。

XOR(排他論理和)

XORどちらか一方が1の時に1を返し、両方とも1、もしくは0の時は0を返します。記号は「^」を使います。

排他“論理和って言っているので何となく論理和の特定値だけ許すのかなっていうイメージがつくと思いますが、異なる値が入力された時だけ許すっていう動きです。こう書くと怒られそうですが、ホモ(同値)は認めないよってことの”排他”って考えると覚えやすいでしょうか。どうでしょうか。

「0b11 (3の値)」と「0b10 (2の値)」のANDを取ると1桁目は両方とも1なので0を返し、2桁目はそれぞれのビットがことんる値なので1を返します。したがって「0b1 (1の値)」になります。なお、不要な0は省略されて出力されますので「0b01」ではなく「0b1」となります。

AND、OR、XORについてはそれぞれの入力によって結果が変わってきて混乱しやすいと思いますので以下に計算結果のまとめを記載しておきます。それぞれ4パターンずつあります。

A B A & B ( AND ) A | B ( OR ) A ^ B ( XOR )
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0
左シフト

左シフトはその名の通りビットを左側にシフトさせる演算子です。記号は「<<」を使用します。演算子の左側にシフトさせたい値、右側にシフトさせたい桁数を記載します。

どういうことかというと、「0b1010(10の値)」を使用するとして左側に一桁シフトさせたいっていうときは「0b1010 << 1」と書きます。左にシフトさせ空いたビットの桁には0が入ります。したがってこの計算結果は「0b10100(20の値)」になります。

右シフト

右シフトは左シフトの反対でビットを右に指定した桁数分シフトさせる演算子です。記号は「>>」を使用します。右側にシフトするので最小桁を削り落とすイメージです。

「0b1010(10の値)」の場合、右側に一桁シフトさせたいっていうときは「0b1010 >> 1」と書きこの計算結果は「0b101(5の値)」になります。

以上で、ビット演算については完了です。あまり使用する機会はないかもしれませんが、考え方自体は非常に重要ですのでしっかりと覚えておきたいところです。

次回からは文字列に入っていく予定です。

今回はここまでです。お疲れ様でした。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

本業ではPHPを使ったWEBアプリやJavaを使用した基幹アプリを作成しております。Pythonは個人的に勉強しており、E資格を取ったりしたおかげで、業務でAIの研究とかも任されるようになりました。学習のアウトプットのために本サイトを運営しておりますが、これからPythonを学ぶという人のお役に立てればいいなと思います。わからないことや調査して記事にしてほしいことがございましたらご連絡いただけると幸いです。

コメント

コメントする

目次
閉じる