はじめMath! Javaでコンピュータ数学

第15回 論理の数学の基本[前編]

この記事を読むのに必要な時間:およそ 2 分

次の例を見てください。ショートサーキット論理積の有効な活用シーンです。

if ((str != null) && (str.equals("user")) ){
   //ユーザ処理
}

strはStringクラスのオブジェクトです。strにnullが入っているとき,str.equals("user")を実行してしまうとエラーが発生します。strにnullが入っているのは,strクラスのオブジェクトが作られていない時です。!=は「等しくない」という意味の比較演算子です。str!=nullの実行結果が真ということは,strクラスのオブジェクトが作られていますからstr.equals("user")を実行してもエラーにならないことが保証されます。このような場合にショートサーキット論理積を利用することで,きれいにコードが書けます。

ただし,次の場合にはショートサーキット演算子の使用が不適切です。

if ((i > 0) && (++j < 3) ){
   System.out.println(i + "," + j);
}

整数変数iの値がゼロ以下だと,次の++jが実行されません。条件式の中で値が変化するような場合で,両方の値の評価が必要ならば,ショートサーキット演算子の&&を用いず&を用いる必要があります※1)⁠常にどちらの演算子を用いるか,意識しておく必要があります。

※1)
(++j<3)を先に評価するなら,&&を使用したままでも良さそうですね。しかし,このコードの元になった文脈が,⁠iがゼロより大きく,このチェックが3回目未満ならば」だとすると,評価式の順番を入れ替えることは,コードの読みやすさを落とすことになるかも。とにもかくにも,case by caseです。今,作ろうとしているコードは,何をするものなのかをよく検討し,コードに反映させましょう。

真理値表

真理値表とは,論理式がどんな論理値をとるのか,全ての場合を列挙した一覧表です。真理値表は論理を表現するための,シンプルでわかりやすい方法です。

真理値表では論理値の真には1を,偽は0を用います※2)⁠

例えば,論理積A・Bの真理値表は表15.3のように書きます※3)⁠

表15.3 論理積の真理値表

ABA・B
000
010
100
111

真理値表には,考えられる全ての場合をもれなく列挙します。先ず,論理変数AとBの値がとりうる全ての組合せを作ります。真理値表では0と1で論理値を表現しますから,2進数にみたてて数え上げるようにすると,もれなく・ダブり無く表を作ることができます。そして,それに対応するように一番右側の列(縦の並び)に論理式A・Bの演算結果を書き込みます。

論理記号・はアンド,すなわち「~かつ~」を表しています。論理変数AとBが両方とも真でない限り,式全体の結果が真にならないという意味です。一番最後の行,AとBが両方とも真(1)のときだけA・Bの値が真になっています。確かにこの真理値表が意図する論理を表していることがわかります。

※2)
英語で真はtrue,偽はfalseです。これらの値の頭文字をとって,T,Fで真理値表を表現する流儀もあります。
※3)
論理回路を取り扱うハード屋さんは,論理式の変数に当たるAやBのことを「入力」と呼びます。論理式は論理回路そのものです。そして,論理式の演算結果は回路の動作出力に当たりますから,⁠出力」と呼びます。どちらかというと,私はこちらの方がしっくりくる呼び名です。数式なのに,入力だとか,出力だとか,なんだか油臭くって面白いと思いませんか?

今回はここまで

論理演算子の意味をとらえることが出来ましたか?次回はそれぞれの論理記号について真理値表を書いてみましょう。そして,Java言語でboolean型と論理演算子を使ったプログラムを書いてみましょう。手を動かすと,読んでいるだけの時の倍以上理解できますよ。

今回のまとめ

  • 論理代数の基本は和・積・否定,そして排他的論理和です。
  • 真理値表は論理を表現するために便利な手段です。

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。2010年のLotYはRuby。結城浩氏のような仕事をしたいと妄想する30代後半♂。