2進数に対するビット演算AND,OR,XOR,IMP,EQV,NOT

Full BASICには2進数に対するビット演算を行う組込関数が用意されていないが,十進BASIC独自拡張の組込関数 bitNOT(a), bitAND(a,b), bitOR(a,b), bitXOR(a,b)を用い,数値を2進数とみなしてビット演算を行うことができる。
 Windows版の場合,Ver. 7.5.4以降で対応する。
 演算は52ビットの2進数として実行される。有理数モードや十進1000桁モードでは十分な精度を持たない。
また,十進モードでは数値変数の精度が49ビット分しかない。


Microsoft BASICのIMP,EQVは,次のようなDEF文で実現できる。

DEF IMP(a,b)=bitOR(bitNOT(a),b)
DEF EQV(a,b)=bitNOT(bitXOR(a,b))

また,AND,OR,XORは予約語ではないので,次のようなDEF文を追加することが許される。

DEF AND(a,b)=bitAND(a,b)
DEF OR(a,b)=bitOR(a,b)
DEF XOR(a,b)=bitXOR(a,b)

Note. これらの関数を2項演算の形に書くことはできない。

Full BASICによるビット演算

NOT

NOT演算(ビット反転)は次のDEF文で代用できる。

DEF bitwiseNOT(a)=-1-a

なお,NOTはFull BASICの予約語なので,関数名をNOTにすることはできない。

AND, OR, XOR

純粋にFull BASICの範囲内でビット演算を行いたい場合は,次のような外部関数定義を用いる。

10 DECLARE EXTERNAL FUNCTION bitwiseAND
20 PRINT bitwiseAND(10,12)
30 END
1000 EXTERNAL FUNCTION bitwiseAND(a,b)
1010 DECLARE NUMERIC aa, bb
1020 DECLARE NUMERIC i,c
1030 LET c=0
1040 FOR i=0 TO 31
1050    LET aa=MOD(a,2)
1060    LET a=(a-aa)/2
1070    LET bb=MOD(b,2)
1080    LET b=(b-bb)/2
1090    LET c=c+MIN(aa,bb)*2^i
1100 NEXT i
1110 IF c>=2^31 THEN LET c=c-2^32
1120 LET bitwiseAND=c
1130 END FUNCTION

MIN(aa,bb)の部分は,ORのときはMAX(aa,bb)に,XORのときはMOD(aa+bb,2)に変える。
上例は32ビットの2進数を対象としている。ビット数を変更したいときは,数値の31と32を変える。


戻る inserted by FC2 system