矢沢 久雄 グレープシティ アドバイザリースタッフ

 コンピュータは,あらゆるデータを数値で表します。それなら,コンピュータは数値に対する四則演算だけができれれば十分なように思えます。ところが実際には,そうではありません。コンピュータは,本来なら数値でないデータも数値で表すからです。このようなデータを演算する場合には,論理演算が大いに役に立ちます。例えば,赤色と青色を混ぜ合わせて紫色というデータを得るには,赤色と青色でOR演算を行うことになります。個々の論理演算の用途は一つに決まっているわけではありませんが,代表的な使い方を説明しますので,イメージをつかんでください。

●AND演算は「マスク」する

図1●8ビットのデータで電球をON/OFFする
 論理演算は1ビットに対する演算ですが,これから取り上げる例では,8ビットのデータに対する論理演算を行います。その方がイメージをつかみやすいからです。この8ビットのデータは,1ビットずつがネオン・サインの電球のON/OFFを表していると考えてください。1でONになり,0でOFFになるとします(図1[拡大表示])。このネオン・サインの表示を変化させるために,4種類の論理演算を行ってみます。

表1●AND演算の真理値表
図2●下位4ビットを強制的にOFFにする
 まずAND演算です。AND演算の用途は,特定のビットだけを強制的にOFFにして,その他のビットはそのままにすることです。この操作を「ビットをマスクする」と言います。マスクとは「覆い隠す」という意味です。AND演算の真理値表(表1[拡大表示])を見てください。aに対してbというデータで演算しますが,bの値が0であれば,aの値にかかわらず(aが0でも1でも)演算結果は0になります(マスクされます)。bの値が1であればaの値は変化しません。

 この性質を利用して,強制的にOFFにしたい(マスクしたい)ビットを0にしたデータでAND演算を行えば,該当するビットをマスクできます。図2[拡大表示]は,10101001というデータと11110000というデータをAND演算することで,下位4ビットを強制的にOFFにする例です。電球のON/OFFを思い浮かべてください。上位4個の電球はそのままで,下位4個の電球がOFFになるのです。

●OR演算は「セット」する

表2●OR演算の真理値表
図3●上位4ビットを強制的にONにする
 OR演算の用途は,特定のビットだけを強制的にONにして,その他のビットはそのままにすることです。この操作を「ビットをセットする」または「ビットを立てる」と呼びます。OR演算の真理値表(表2[拡大表示])を見てください。aに対してbというデータを演算しますが,bの値が1であれば,aの値にかかわらず(aが0でも1でも)演算結果は1になります(セットされます)。bの値が0であれば,aの値は変化しません。

 この性質を利用して,強制的にONにしたい(セットしたい)ビットを1にしたデータでOR演算を行えば,該当するビットをセットできます。図3[拡大表示]は,10101001というデータと11110000というデータをOR演算することで,上位4ビットを強制的にONにする例です。電球のON/OFFを思い浮かべてください。上位4個の電球がすべてONになり,下位4個の電球はそのままです。

●XOR演算は部分的に反転させる

表3●XOR演算の真理値表
図4●上位4ビットを強制的に反転する
 XOR演算の用途は,特定のビットだけを強制的に反転(0なら1に,1なら0に)して,その他のビットはそのままにすることです。XOR演算の真理値表(表3[拡大表示])を見てください。aに対してbというデータを演算しますが,bの値が1であれば,aの値にかかわらず(aが0でも1でも)演算結果が反転します。bの値が0であれば,aの値は変化しません。

 この性質を利用して,強制的に反転したいビットを1にしたデータでXOR演算を行えば,該当するビットを反転できます。図4[拡大表示]は,10101001というデータと11110000というデータをXOR演算することで,上位4ビットを強制的に反転にする例です。電球のON/OFFを思い浮かべてください。上位4個の電球のON/OFFが反転し,下位4個はそのままです。

●NOTは全体的に反転する

図5●データを一気に反転する
 NOT演算の用途は,すべてのビットを強制的に反転(0なら1に,1なら0に)することです。複数けたのデータにNOT演算を行うと,全体が一気に反転します(図5[拡大表示])。電球のON/OFFを思い浮かべてください。すべての電球のON/OFFが反転するのです。

 NOT演算は,すべてのビットが1であるデータを用いてXOR演算を行うのと同じ演算結果になります。全体を反転する場合には,XOR演算を使うよりNOT演算の方が効率的です。

●赤色 AND 青色で紫色のデータを作る

 最後に論理演算の応用例です。Webページの作成で使われるHTMLファイルでは,色を24ビットのデータで表します。この24ビットは,上位8ビットで赤色(R)の濃度を表し,真ん中の8ビットで緑色(G)の濃度を表し,下位8ビットで青色(B)の濃度を表します。RGBモニターのRGBの順になっていると覚えれば,簡単ですね。HTMLでは,2進数を使わず,2進数の4けた(0000~1111)を1けた(0~F)で表す16進数が使われます。したがって,濃度100%の赤色はFF0000となり,緑色は00FF00となり,青色は0000FFとなります。

図6●赤色と青色のOR演算で紫色を作る
 赤色,緑色,青色のデータが重なり合わないように8ビット(16進数では2けた)ずつずらしているのは,OR演算で色を混ぜ合わせられるからです。例えば,赤色FF0000と青色0000FFをOR演算すると,FF00FFとなります。これは,紫色を表していることになります。0とOR演算しても変化しない,FF(2進数では11111111)とOR演算すると強制的に1にセットされることを思い出してください(図6[拡大表示])。

図7●紫色から青色成分を抜き取る
 紫色FF00FFから青色成分を抜き取ってみましょう。そのためには,FFFF00というデータとAND演算を行います。FFFF00という下位8ビットが0になったデータとAND演算を行うと,下位8ビット(青色成分)が強制的に0になり,その他のデータは変化しません。演算結果はFF0000となり,紫色から青色成分を抜き取ると赤色となることがわかります(図7[拡大表示])。

 青色成分を抜き出すFFFF00のようなデータを「マスク・パターン」と呼びます。青色成分のマスク・パターンは,青色0000FFを反転したものですから,NOT演算によって求められます。

 4種類の論理演算に対して,イメージとしてつかんでほしいことをまとめておきます。AND演算は,「かつ」を表すもので,データをマスクするために使います。OR演算は,「または」を表すもので,データをセットするために使います。XOR演算は,「排他」を表すもので,データを部分的に反転するために使います。NOT演算は,「否定」を表すもので,データを全体的に反転するために使います。バッチリ理解していただけましたね。

 次回は,論理演算を組み合せて四則演算を行う方法を説明します。お楽しみに!