【Python】ビット演算(AND、OR、XOR)の計算とOR演算を使用したマスタチェック処理

■概要

本稿では、Pythonのプログラミングにおける、以下の2点について解説する。

・ビット演算(AND、OR、XOR)の計算処理

・OR演算を使用したマスタチェック処理

■論理演算

論理演算は、0(FALSE)または1(TRUE)をとる値について計算する。

今回は、「AND」、「OR」、「XOR」のビット演算について説明する。


・AND:論理積
「a」および「b」の両方が「1」である場合、「1」を返す。
それ以外は、「0」を返す。


・OR:論理和
「a」または「b」の少なくとも片方が「1」である場合、「1」を返す。
それ以外は、「0」を返す。


・XOR:排他的論理和
「a」または「b」の片方が「1」である場合、「1」を返す。
それ以外は、「0」を返す。

■ビット演算

ビット演算を机上で行う場合は、以下の操作を行う。
①2進数に変換する。
②桁数(1の位、2の位、4の位・・・)ごとに計算する。
③計算結果を10進数に戻す。

なお、Python でビット演算を行う場合は、10進数のまま計算してくれる。


<参考:N進数・10進数の演算>

・N進数から10進数の計算処理


・10進数からN進数の計算処理

▼ANDの演算

「a = 6」、「b = 2」のAND演算を行うと、
「110」AND「010」=「010」(2)となる。


pythonによるAND演算を行う場合は「&」を使用する。

a = 6
b = 2

print('a AND b : ', a & b)

# 実行結果
# a AND b :  2

▼ORの演算

「a = 6」、「b = 2」のOR演算を行うと、
「110」OR「010」=「110」(6)となる。


pythonによるOR演算を行う場合は「|」を使用する。

a = 6
b = 2

print('a OR b : ', a | b)

# 実行結果
# a OR b :  6

▼XORの演算

「a = 6」、「b = 2」のXOR演算を行うと、
「110」XOR「010」=「100」(4)となる。


pythonによるXOR演算を行う場合は「^」を使用する。

a = 6
b = 2

print('a XOR b : ', a ^ b)

# 実行結果
# a XOR b :  4

■OR演算を使用したマスタチェック処理

ビット演算の「OR演算」を利用して、指定したデータがすべて正しいかどうか判定することができる。

データ項目を桁数(1の位、2の位、4の位、8の位・・・)に指定し、初期値を「0」に設定した後、各桁(データ)項目が正しい場合は「1」をOR演算で追加していく。

最終的に全ての桁(データ)が正しいか判定し、データの確らしさを判断可能となる。

▼作成するプログラムの概要

3つのマスタデータについて正しさを判定する処理をOR演算を使用して実装する。

正しいマスタデータは以下とする。
・マスタデータ1:aaa
・マスタデータ2:bbb
・マスタデータ3:ccc

▼フローチャート

▼プログラム仕様

・マスタデータチェック関数

<引数と戻り値>

項目項目内容
引数辞書型マスタデータを設定する。
キー項目は以下の通り。
・マスタデータ1
・マスタデータ2
・マスタデータ3
戻り値文字列型【チェックが正しい場合】
OK
【チェックが正しくない場合】
NG

<処理内容>

入力処理内容出力
チェック用変数の初期値セットする。
初期値:0
※OR演算で使用する。
▼条件分岐:マスタデータ1
|【値がaaaの場合】
|OR演算を行う。:「000 OR 001」→「001」
|【その他】
|何もしない。
▼条件分岐:マスタデータ2
|【値がbbbの場合】
|OR演算を行う。:「001 OR 010」→「011」
|【その他】
|何もしない。
▼条件分岐:マスタデータ3
|【値がcccの場合】
|OR演算を行う。:「011 OR 100」→「111」
|【その他】
|何もしない。
▼条件分岐:チェック用変数の値
|【7(2進数:111)の場合】
|「OK」を返す。・・・①
|【その他】
|「NG」を返す。・・・②
【戻り値】
①OK
②NG

▼サンプルコード

# マスタデータチェック関数
def CheckMasterData(mst_data):
    # チェック用変数の初期値セット
    check_num = 0

    # マスタデータ1チェック
    if mst_data['mst1'] == 'aaa':
        # OR演算:「000 OR 001」→「001」
        check_num = check_num | 1

    # マスタデータ2チェック
    if mst_data['mst2'] == 'bbb':
        # OR演算:「001 OR 010」→「011」
        check_num = check_num | 2

    # マスタデータ3チェック
    if mst_data['mst3'] == 'ccc':
        # OR演算:「011 OR 100」→「111」
        check_num = check_num | 4

    # 2進数「111」(10進数で7)になったらチェックOK
    if check_num == 7:
        return 'OK'
    else:
        return 'NG'


if __name__ == '__main__':
    # 各マスタデータをセット
    dict_mst_data1 = {'mst1': 'aaa', 'mst2': 'bbb', 'mst3': 'ccc'}
    dict_mst_data2 = {'mst1': 'yyy', 'mst2': 'bbb', 'mst3': 'ccc'}
    dict_mst_data3 = {'mst1': 'bbb', 'mst2': 'aaa', 'mst3': 'ccc'}

    # 各マスタデータが正しいかチェック
    print('マスタデータ1:', CheckMasterData(dict_mst_data1))
    print('マスタデータ2:', CheckMasterData(dict_mst_data2))
    print('マスタデータ3:', CheckMasterData(dict_mst_data3))

▼実行結果

マスタデータ1: OK
マスタデータ2: NG
マスタデータ3: NG
タイトルとURLをコピーしました