コンピューターサイエンス入門:理論編
OR / XOR でフラグを操作する
この回でやること
ORでオンにする操作とXORで反転する操作を読み解き、繰り返したときの違いを確かめます。
- 読む 約 7 分
- 最後にクイズ 1 問
見るだけでは、設定を変えられない
前回は通知設定を & で読み出しました。今回はプッシュ通知だけをオンにする、SMSだけを反転する操作を読みます。ほかの桁は変えません。
ANDで0の桁を1にはできません。足し算も 001 + 001 = 010 と繰り上がり、隣の桁が変わります。オンにする操作にはORを使います。
OR は、消さずに立てる
| は、どちらかが 1 なら 1 を返します。両方が 0 のときだけ 0 です。
プレーンテキスト
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1マスクが1の桁は1になり、すでに1ならそのままです。マスクが0の桁も変わりません。
Python
PUSH = 0b010
settings = 0b101 # メールとSMSがオン
settings = settings | PUSH
print(settings) # 7 2進数では111
settings = settings | PUSH
print(settings) # 7 もう一度でも同じXOR は、押すたびに入れ替わる
^ は、2つが違うときだけ 1 を返します。同じなら 0 です。
プレーンテキスト
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0マスクが1の桁は、0なら1に、1なら0に変わります。マスクが0の桁は動きません。オンとオフを切り替えるスイッチに相当します。
Python
SMS = 0b100
settings = 0b111
settings = settings ^ SMS
print(settings) # 3 2進数では011
settings = settings ^ SMS
print(settings) # 7 2進数では111、元に戻る| と || は別物
Pythonの | と or、JavaScriptの | と || は役割が違います。前者はビットごとに計算し、後者は値全体を真か偽かとして判断します。
Pythonの 0b101 or 0b010 は、左の値が真と扱われ、その値 0b101 を返します。桁ごとのORの結果 0b111 にはなりません。エラーが出なくても意図した計算かを確かめます。
例題で確かめる
4つの設定が 1001 の機器で、重み2の設定をオンにし、次に重み4の設定を反転します。
プレーンテキスト
1001 | 0010 = 1011
1011 ^ 0100 = 1111ORで右から2桁目が立ち、XORで3桁目が0から1に変わります。答えは 1111、10進数で15です。他の桁は変わりません。