IT用語/ブール演算

排他的論理和って何だっけ・・・(2014-09-06、追記:2019-04-14)


なんでしょう、これ、もう説明のしようがないので、
ひたすら図が並びますが、ご容赦を。
試験対策に、やむをえず、覚えたもので・・・


論理和(OR)

入力A入力B出力
000
101
011
111

論理積(AND)

入力A入力B出力
000
100
010
111

否定(NOT)

否定も、補集合(Compliment)も、相補演算(Complementary Operation)*1も全部同じことだろ?なんでいちいち呼び方変えるんだよ!

入力A出力
10
01

排他的論理和(EOR、XOR)

入力A入力B出力
000
101
011
110

否定論理和(NOR)、否定論理積(NAND)

論理和、論理積の出力(0/1)が逆になるだけ

ド・モルガンの法則

!(A || B) == !A && !B
!(A && B) == !A || !B

いや、もう俺は情報処理試験で(不合格も含めて)一体何回これを覚えては忘れてるんだ?
使わないと速攻忘れる・・・。海馬*2が病んでるのか?

実際に使う時の例、その1

当時、情報処理試験の為にわけも分からずイヤイヤ覚えたメモなのでこれでも良かったのですが、
それも味気ないので、もう少しだけ追記します。

true & !true = false (真に偽のマスクをかけると、偽)

とか言われてもピンとこないかもしれませんが、
まずは、ふーん、ぐらいで十分です。
この ! 記号はNOT、 & が ANDです。

0b0110 & ~0b0010 = 0b0100 (偽真真偽 に 偽偽真偽 のマスクをかける)
(    6 &      ~2 =      4 )

とか、本番?ではフラグを4つで使ったりします。
こんどは ! が ~ になってますが同じNOT(ビット反転)です。
(4桁の二進数、先頭はjava風の表記だと 0b です)
ちなみに、0b0110 は十進数では6、0b0111 は7ですね。
上の、6とか2とかをふまえて、これを更に3つ並べると、

Linux の man umask より
0666 & ~022 = 0644; (i.e., rw-r--r--)

Linuxで何か任意のファイルを作成した時に、
デフォルトの権限(0666)にそのユーザのumask(0022)でマスクをかけるぞ、と。
禁止したい権限、ここではwrite権限(=2)について、
あらかじめ、それっぽいマスク 022 として指定しています。

実際に使う時の例、その2

別の例です。
javaで書くと、boolean ですね。真か偽の二択です。

boolean a = true, b = false;
System.out.println("AND:" +  (a & b)); // false

boolでも分かりやすいのですが、
使ってみるとわりと便利なのが、intで表現する方法です。

final int
    FLAG_A = 2,
    FLAG_B = FLAG_A*2,
    FLAG_C = FLAG_B*2;
int flag = FLAG_A | FLAG_B; // つまり6
System.out.println("flag:" + flag); // 6
System.out.println("mask:" + (flag & ~FLAG_B)); // 2

boolean で配列作れば良いんですが、それがめんどくさい or 1つの変数に全部ねじ込みたい時に
2の倍数でフラグを作っておけば、いい感じに & やら | やらで利用できます。
これって、C にせよ java にせよ、
関数の引数で"|"でフラグを重ねて指定する方法は、わりと出てきますよね。

// Androidでダイアログに、なんかフラグを渡す時の例
dialog.getWindow().setSoftInputMode(
        WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE
                | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN
);

SOFT_INPUT_STATE_ALWAYS_VISIBLE とかは intです。
細かい説明はここではしませんが、"|" で複数のフラグを同時に付与する感じです。

こんな感じで、覚えた当初はちんぷんかんぷんでしたが、
わりと使うんですよね、ぶーる演算っぽいことは。

でも、ド・モルガンの法則は、まだ試験以外では使ったことありません [smile]


*1 まぁ、意味は違いますが・・・。昔から数学なんて嫌いだ。
*2 長期記憶は大脳新皮質ですね。短期記憶(海馬)に繰り返し入れることで、やがて長期記憶へ・・・ちっとも入らない。何故じゃ?無理じゃよ~。

  最終更新のRSS