こんにちわこんばんわこんばんこ。
こんな時期(現在、2020年3月2日)に風邪を引いたと思われる飯田です。
風邪なのか、なんなのか?わからないけど、検査を受けるような症状ではないことは確かです。
今日も勉強した内容にPythonを絡めてアウトプットしていきたいと思います。
ベン図って普段使いますか??割と仕事している時に物事を整理して考えるときに利用すると思います。
僕がよく使うのは、情報系システムでデータ抽出を行う際に、どのような項目でどのような条件設定であれば欲しいデータが取れるかを考える際に、なんとなく使っていたりします。
例えば、一人暮らししている社会人の顧客を抽出したい場合、「配偶者」や「同居人数」、「勤務先」といった項目を項目として利用し、それぞれ、「無し」・「0人」・「有」といった形でデータ抽出すると欲しいデータが抜けますよね。
今日はこのベン図と、集合、それからコンピューターにおける論理演算についてアウトプットしたいと思います。
自社の顧客、日本国民、世界人口、切り方はどれでもいいですが、とにかくまずは全体を決め、そこから部分を特定します。(上でいうと、社会人と一人暮らしですね)
集合とは、全体を決めて、その中で特定の条件に合致する部分を特定するためのもの・・・だと理解しました。(間違ってたら教えてプリーズ笑)
今回は、全体を自社の顧客とし、一人暮らしをAの集合・社会人をBの集合とします。
コンピューターは1か0かで演算をするので、自社の顧客のうち、社会人かつ一人暮らしの顧客の集合をCとすると、CはA = 1 & B = 1 となります。
Cを求める方法を「論理積」といいます。
ちなみに、コンピューターにおける論理演算で論理積がどのように行われるかというと、2進数同士の桁を比較し、双方が1の場合は1、それ以外の場合は0という演算を行います。
Pythonでも実行してみましょう。(論理積のビット演算子は & です)
ん・・・?42がそのまま出てきました。
ではこれを2進数にして見てみましょう。
分かりましたか?10進数42は2進数「101010」、10進数58は「111010」、それぞれの桁を比較し、どちらも1の桁のみ1とし、それ以外は0とすると・・・
計算結果は「101010」、42のままとなるんですね。
次に論理和を見てみましょう。論理和とは、A or Bのことで、AかBいずれかに所属する集合ということです。つまり、社会人で同居人数が2人以上、もしくは社会人以外の一人暮らし(学生や年金暮らしの老人等)、あるいは一人暮らしかつ社会人ということになります。
上の図の赤と黄色とオレンジの部分(C)いずれかに該当する部分が、論理和です。(いずれかに該当という言い方が分かりやすいですね)
Pythonでは論理和を求める場合、A ❘ Bとして計算します。
やってみると・・・
先ほどと異なり、今度は58となりました。では、これも2進数に変換して見てみましょう。
いずれかが1であれば、1となっていますね。先ほどの論理積と比較すると左から2桁目が論理積では0となりましたが、論理和では1となりました。
排他的論理和は、A・Bいずれかのみに該当するものの集合です。
先ほどの論理和と異なるのが、論理積の部分(オレンジ部分)が対象から外れているところです。
ちなみに、排他的論理和はPythonでは演算子^で計算します。
排他的論理和の場合、共通部分は対象外(0)となるため、計算結果は10000(10進数16)となります。
否定は簡単にいうと、A・Bいずれにも属さない部分の集合を表します。
ベン図でいうと、水色の部分。
AでもBでもないので、否定です。
予想は着くと思いますが、2進数では1,0を反転させる動きとなります。
ビット演算子は~で右辺のみに数字を入れます。
ビット演算してみると、
となります。PythonのNot演算をした場合、-(3+1)となる値を返すようになっています。この-(3+1)ってどっかで見たことありますよね。
絶対値にマイナスを付けた状態での出力となります。
単純に反転させたビットを符号付き2進数として出力したい場合は、以下の通り出力します。
8ビット表示させる時は、0xff。4ビットの時は0xfと、必要なビット桁数の最大値との論理積を出力することで符号付き2進数で出力ができます。左端1桁が符号(1なのでマイナス)です。
↓符号付き2進数については、こちらを参照
alというリストに格納された0~9までの数字を出力するような記載です。
が、出力の際にnot演算子を「~」を付けています。これによりビット反転で、負の数字が出力されるはずですが、そうなりますでしょうか。
予想通りの結果となりましたね。
こんな使い方もできるので、数値であればビット演算子を今後は使っていくことを意識したいと思います。
なんとなくor演算とかifを使わずに条件式的なことができそうですよね。
理解せず丸暗記は流石にきつい内容ですね。でも、ちょっとだけでも分かってくると、なんだかワクワクしてくる内容ですよね。
最後まで読んでいただきありがとうございました。