eratohoまとめ

論理演算における覚え書き(初心者向き)

eraにおける論理演算を理解するための初心者向き覚え書き。
著者は実は間違って憶えているかもしれないので、ここの
記述に大きな間違いが含まれているかもしれないことに
注意してほしい。



eramakerにおける数値変数

 32ビット符号つき整数=2進数32桁

10進数における「1」はera内部では
00000000000000000000000000000001

 符号付きであるので一番左の桁は符号を表す。
 0なら+、1なら-の数値。
 なお2の32乗は4294967296であるが、eraでは符号付きで
表現するため-2147483648~2147483647の範囲が使用できる。
 ちなみにEmueraの場合は32乗の部分が64乗に拡張されている。

2進数における桁表現

 さきほどの2進数表現における一番右側の部分の数字1つを
1ビット目と表現してみる。これは2の1乗の桁のことである。
そして、その隣の数字1つは2ビット目だが、2の2乗の桁のこと
を表している。そのままいくと一番左側の数字1つは32ビット目
で、2の32乗の桁のことである。

ビットが立つ、立たない

 そのビット(すなわち桁)の数字が1の時をビットが立つ
もしくは立っていると表現する。0の時はビットが立っていない
と表現する。
 ビットを立てるとはそのビットを1にする処理のことである。

真と偽

 真とはその条件が成り立つことであり、TRUEもしくは
Tとも表される、eraにおいてはその結果として1を出す。
 偽とはその条件が成り立たないことであり、FALSEもしくは
Fとも表される。eraにおいてはその結果として0を出す。
 条件に対して真もしくは偽の結果以外のものが出ることは
ありえない。

論理演算

 論理演算とは数値同士をビットごとにとある条件について
比較して結果を出すことである。ビットごとであるので、
違うビットに影響を及ぼすことは普通はない。通常の四則演算
みたいに次の桁への桁上がりとかもない。

単項演算と2項演算

 単項演算とは1つの値(変数、定数)に対して演算を行う
ものである。NOT演算など。
 2項演算とは2つの値(変数、定数)に対して演算を行う
ものである。AND演算やOR演算やXOR演算など。
 3項演算すなわち3つの値に対して演算を行うものもある。

AND演算

 AND演算とは論理積のことである。
ビット比較において1と1の場合が真になることである。
比較すべきビットを掛けたときに1と1の場合だけが1になるので
積ということである。

例:10AND12を求める

 10は1010、12は1100で表される。
 2^4の桁は1と1なので1
 2^3の桁は0と1なので0
 2^2の桁は1と0なので0
 2^1の桁は0と0なので0
よってもとめたものは1000なので8となる。

OR演算

 OR演算とは論理和のことである。
ビット比較において比較するいずれかに1があれば真になること
である。
比較すべきビットを足したときに0と0の場合以外はすべて0で
なくなるので和のよう(厳密には違うが)であるということだ。

例:10OR12を求める

 10は1010、12は1100で表される。
 2^4の桁は1と1なので1
 2^3の桁は0と1なので1
 2^2の桁は1と0なので1
 2^1の桁は0と0なので0
よってもとめたものは1110なので14となる。

XOR演算

 XOR演算とは排他的論理和のことである。
ビット比較において比較するいずれかに1があり、なおかつ
両方が1でないのであれば真になることである。
排他的というのは同じだったらだめという意味である。

例:10XOR12を求める

 10は1010、12は1100で表される。
 2^4の桁は1と1なので0
 2^3の桁は0と1なので1
 2^2の桁は1と0なので1
 2^1の桁は0と0なので0
よってもとめたものは0110なので6となる。

NOT演算

 NOT演算とは論理否定のことで単項演算である。
これは各ビットを反転させる効果がある。
そのビットが0なら1へ、1なら0へ変化させられる。

論理演算は何に使うの?

 基本的には各桁(ビット)がON/OFFのスイッチであると
考えればいい。
 単純にひとつの変数をフラグとして使う場合、それが
実質ON/OFFでしか認識されないようなケースはあるだろう。
たとえば素質を持っている/いないの判別用とか。
 その場合、似たようなフラグを組み合わせることが可能
になる。それこそ、32個(Emueraなら64個)を一つのフラグ
で切り替えることができる。
 ただし、ON/OFF以外の情報を持たせたものすなわち
数字の中身も重要なフラグ(例:体力、所持金、日付など)
においては基本的にはビット管理は使えない。
 そして、ビット管理をする場合においてはどのスイッチを
入れたり切ったりしたり状態を判別したりするときに
さっきまでの論理演算や周辺知識は必須となる。

数字の中身が限られたフラグをビット管理する。

 たとえば、TALENT:処女において0なら処女でない。
1なら本当の処女。2なら再生処女である。そういうときは
ビット管理は使用可能である。
 ようするに、そのためには複数のビットを使用すればいい。
 1ビット目と2ビット目の両方が立っていないなら処女では
ない。
 1ビット目だけ立っていれば本当の処女。
 1ビット目と2ビット目の両方が立っていれば再生処女。
 当然、応用すればある程度中身に幅のあるフラグをすべて
ビット管理することができる。

何ビット目を立てる

 普通にフラグに数値そのものを代入するのは以下のとおり。
A = 1
 そうではなく例えば1ビット目を立たせたいときには、
A |= 1
 同様に1ビット目と2ビット目を同時に立たせたいときには、
A |= 3
 となる。なぜ3なのか?それは3の2進数が「11」だから
である。
 つまり、既にビットが立っている数値を|=という演算子を
使用して代入すればいい。

何ビット目を立ってないようにする

 では、1ビット目を「0」にしたいときは?
A -= 1
 単純に1を引いているがそれは1の2進数が「1」だからで
ある。すなわち既にビットが立っている数値を減算すれば
減算する数値の立っているビットを立っていないようにする。
A -= 15
 上の例では15を引いているが、15は2進数では「1111」と
なっておるのでAのビットの1・2・3・4のすべてが立っていない
よう(0)になる。

何ビット目が立っているかいないかを調べる

 当然、フラグの何ビット目の状態を調べる必要があるが、
それには以下のようにすればいい。
SIF A & 2
^   PRINTL Aの2ビット目が立っています
 上において&というのは演算子であり、ここではフラグを
調べるためのものであるという認識でいい。その前の「A」は
調べたいフラグである。また後ろの「2」に調べたいフラグの
中のビットを立てた数値を入れるのである。ここでは「2」
なので2進数では「10」となるからAのフラグの2ビット目が
立っている(1)のであればこのSIF文が成り立つ(真である)
ということになる。













タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2009年10月13日 11:13