ANDやORは、普通の論理演算子としても利用できますが、実装はビット毎(Bitwise)論理演算子になっています。これは、桁(ビット)毎に突き合わせて結果を出す演算子である、という意味です。ここでは、AND、ORの他に、XORとNOTにも触れます。まず機能を書き出しておきます。
AND |
( n1 n2 -- n ) |
\ n1とn2を比べ、両方とも1だったビットだけ1、それ以外は0であるような値を残す |
OR |
( n1 n2 -- n ) |
\ n1とn2を比べ、少なくとも一方が1のビットだけ1、それ以外は0であるような値を残す |
XOR |
( n1 n2 -- n ) |
\ n1とn2を比べ、どちらか一方だけが1のビットは1、それ以外は0であるような値を残す |
NOT |
( n -- n' ) |
\ nのビット毎に、1は0に、0は1に反転した値を残す |
あるFlagの第15ビットがOnかOFFかを調べるには、第15ビットだけがONの値とANDすれば良いわけです。この結果が0なら第15ビットは0だったわけですし、非0なら第15ビットは1だったことがわかるからです。これを"マスク"といいます。
1 15 << flag AND IF ...
ANDとNOTは、Mops/Forthでは論理演算子でもあります。というのは、そこではfalseは0、trueは-1で表されており、-1は全てのビットが1として表現されるからです。ところが、真理条件判定では、0以外の値は全て真として扱われます。このような-1ではない真を"不真正のtrue"と呼ぶとすれば、この不真正のtrueには、ANDとNOTは論理演算子として働いてくれません。というのは、例えば、第15ビットだけが1の数値と第16ビットだけが1の数値があった場合、真偽判定では双方とも真になりますが、ANDしてみると、共通にONとなっている桁がないために結果は0(false)になってしまいますし、どちらをNOTしても、やはり真偽判定は真のままです。
そこで、不真正のtrueに対して論理的な"かつ"を用いるためには、あらかじめ"真正のtrue"に変換しておく必要があります。これは"0<>"で実現できます。0でない数値はtrueになりますし、0は0のままです。この処置をした後には、"AND"は論理的"かつ"演算と見ることができるようになります。
論理的な否定が必要なときには、NOTではなく、むしろ、0=で代替すべきでしょう。つまり、NOTはビット毎演算であって、論理演算ではないと考えた方が間違いが少なくなるかもしれません。
関連項目:
最終更新:2018年12月25日 14:36