07:ゲームで理解する論理演算

07:ゲームで理解する論理演算

論理演算

前回はPROCESSINGで計算を行う方法を紹介しました。

計算の中には四則演算のような算数的な計算以外にも、実にコンピュータらしい計算があります。

コンピュータは2進数(1と0)で動作しているとお話しましたが、この1と0を扱う専門の計算があるのです。これを論理演算といいます。

論理演算には

  • OR(オア:論理和)
  • AND(アンド:論理積)
  • XOR(エックスオア:排他論理和)
  • NOT(ノット:否定)

の4つがあります。

1つ1つ見てみましょう。

OR(論理和)

2つの1と0を比較して、片方でも1なら1、両方0なら0にする計算です。

図にすると下記のようになります。

論理和1これだけだと、ちょっと味気ないので例えを出してみましょう。OR演算子は、ゲームなどで面白い使い方ができます。

たとえばRPGを考えてみましょう。主人公が敵に攻撃されると、毒状態、睡眠、麻痺、石化、混乱など様々な状態異常になりますよね。

多くのゲームでは、このようなキャラクターの状態を1と0で管理しています。1なら「異常」、0なら「正常」といった感じです。

論理積3(画像URL:illust-AC 様)

例えば主人公の状態を「睡眠、毒、麻痺、石化」の4つで管理したい場合、4bitを使います。0000なら正常。1000なら睡眠異常、0100なら毒といったように管理します。

ここで主人公がある敵に攻撃された時、毒状態になるとします。こんな時にOR演算を利用します。

論理和3
(画像URL:illust-AC 様)

上記にように、正常状態(0000)だった主人公に、毒(0100)をORします。そうすると主人公は必ず毒状態(x1xx)となります。

すこしヤヤコシイのですがコンピュータでは、ある条件Aと条件Bが「どちらか片方でも成立していればOK」という判断をしたい場合があります。このような場合もOR演算子を使うのです。

AND(論理積)

2つの1と0を比較して、両方共1なら1、片方でも0なら0にする計算です。

図にすると下記のようになります。
論理積1
AND演算子も、ゲームなどで面白い使い方ができます。

先ほどと同じようにRPGの例を考えます。例えば毒状態で、しかも石化までしている状態(0101状態)の主人公に「解毒の魔法」をかけるとします。

解毒の魔法ですから、毒状態だけを回復させたいです。主人公が毒状態で、しかも石化までしている場合でも、毒だけ回復しなければいけません。石化は回復してはダメです。

こんな時に、AND演算が役に立ちます。具体的には、以下のようにします。

論理積2
(画像URL:illust-AC 様)

魔法使いが唱えている呪文は、私の好きなゲーム(ウィザードリィ)に登場する解毒の呪文です。別にドラクエのキアリーでも構いません(笑)。

このように、回復させたい箇所だけを0にした情報とAND演算する事で、その場所だけを0に戻すことができます。

XOR(排他論理和)

2つの1と0を比較して、両方共同じなら0、違っていれば1にする計算です。

図にすると下記のようになります。
排他論理和1ANDやORはともかく、あまり馴染みがない計算ですよね。要は2つの条件がそろっていれば0、そろっていないと1になる計算になります。

またまたRPGを例に考えてみましょう。

RPGといえばダンジョンです(笑)。真っ暗闇のダンジョンの中で明かりを灯す場合を考えてみます。明かりを灯す道具には、ランプと松明(たいまつ)があるものとします。

主人公が明かりを灯しているかどうか(明かり状態)を1と0で管理する事にします。

両方ついていないなら00、ランプだけついているなら10、松明だけがついているなら01といった感じで管理します。

排他論理和2(画像URL:illust-AC 様)

主人公が松明をつけます。しかし松明は一定時間たつと燃え尽きて消えてしまいます。これをXORで処理します。

排他論理和3(画像URL:illust-AC 様)

松明を使った際に、該当アイテムの箇所を1にした情報(01)とXORします。すると元の状態(00)と異なる箇所が1に、同じ箇所は0になるので、bitは01になって松明だけが灯ります。

松明が一定時間経過して燃え尽きた場合は、松明を灯した時と同じ情報(01)で再度XORします。そうすると灯っていた箇所が0になるので、みごと松明だけを消せます。

ポイントは、ランプの状態に関わらず松明だけを制御できる所です。

●真っ暗闇(00)から松明(01)だけを灯した

松明ON1(画像URL:illust-AC 様)

●ランプが灯っている(10)状態から、さらに松明を灯す

松明ON2(画像URL:illust-AC 様 )

●両方灯っている状態(11)から、松明だけが消える

松明OFF1(画像URL:illust-AC 様 )

●松明だけ(01)が灯っている状態で、松明が消える

松明OFF2(画像URL:illust-AC 様 )

うまく動作する事がわかると思います。

これを利用すれば、ランプは点灯時間が長いけど松明は短いなど、RPGでよくある設定を上手に制御する事が可能となります。

NOT(否定)

否定は1を0に、0を1に反転させる処理です。

図にすると下記のようになります。
否定1
否定は単純に1と0を反転させます。男の否定は女。右の否定は左みたいなものです。

論理演算だけを考えると、日常生活とはあまり関係がないので理解しにくいのですが、RPGなどでの処理と合わせて考えると、すこし理解が進むのではないかと思います。

 

今日の言葉

・論理演算

1と0を専門に扱う計算方法です。OR、AND、XOR、NOTがあります。

・OR(論理和)

2つのbitで、どちらか片方でも1なら1に。両方0なら0になる計算です。RPGでステータスを付与する際などに使われます。

・AND(論理積)

2つのbitで、両方が1なら1、片方(または両方)が0なら0になる計算です。RPGでステータスを除外する際などに使われます。

・XOR(排他論理和)

2つのbitがそろっていれば0、不揃いなら1になる計算です。RPGでアイテムの効果を管理する際などに使われます。

・NOT(否定)

1を0に、0を1に反転する計算です。男の否定は女になります。単純な否定処理(反転処理)は画像加工プログラムなどで良く使います。

 

今日のまとめ

  • 1と0を専門に扱う計算(論理演算)がある。
  • 論理演算にはOR、AND、XOR、NOTがある。

電子書籍のご案内

よりわかりやすく詳細にまとめたものを、以下の電子書籍として販売しております。書籍については、下記書籍ページを参照してください。

 

本ページの文章及びプログラムは、全てMSLABOに著作権があります。
本ページで利用している画像、フォントには、参照元リンクの企業・団体・個人に著作権があります。
著作権に従い、適切に利用して下さい。