$ZBOOLEAN(arg1,arg2,bit_op)
$ZB(arg1,arg2,bit_op)
概要
$ZBOOLEAN は、2 つの引数 arg1 と arg2 に対して、bit_op によって指定されたビット単位論理演算を実行します。$ZBOOLEAN は、 bit_op 値で指定されたように arg1 と arg2 のビット単位結合の結果を返します。ZZDUMP コマンドを使用して、結果を表示することができます。
$ZBOOLEAN は、文字列または数字のいずれかに対して演算を実行します。文字列の場合、文字列内の各文字に対して、論理積と論理和を実行します。数字の場合、数字全体を 1 つの単位として、論理積と論理和を実行します。数値文字列を数字に評価させるには、文字列の前にプラス符号 (+) を付けます。
Note:
$ZBOOLEAN は ASCII 255 より大きな値の Unicode 文字をサポートしません。$ZBOOLEAN を 16 ビットの Unicode 文字の文字列に適用するには、まず $ZWUNPACK を使用し、次に $ZBOOLEAN、さらに $ZWPACK を続ける必要があります。
$ZBOOLEAN と $BITLOGIC が使用するデータ形式は異なります。一方の結果を、もう一方の入力として使用することはできません。
このビット単位演算では、arg1 と arg2 のブーリアンの組み合わせが 16 種類考えられます。以下の表で、その組み合わせを示しています。
bit_op のビット・マスク |
実行される演算 |
0 |
0 |
1 |
arg1 & arg2 (論理 AND) |
2 |
arg1 & ~arg2 |
3 |
arg1 |
4 |
~arg1 & arg2 |
5 |
arg2 |
6 |
arg1 ^ arg2 (論理 XOR (排他的 or)) |
7 |
arg1 ! arg2 (論理 OR (包含 or)) |
8 |
~(arg1 ! arg2) |
9 |
~(arg1 ^ arg2) |
10 |
~arg2 (論理 NOT) |
11 |
arg1 ! ~arg2 |
12 |
~arg1 (論理 NOT) |
13 |
~arg1 ! arg2 |
14 |
~(arg1 & arg2) |
15 |
-1 (0 の 1 の補数) |
以下はその説明です。
& は論理 AND
! は論理 OR
~ は論理 NOT
^ は XOR (排他的 OR)
詳細は、"ObjectScript の使用法" の "演算子" を参照してください。
すべての $ZBOOLEAN 演算は、bit_op 値 0、3、5、10、12、および 15 を含む arg1 と arg2 の両方を解析します。
$ZBOOLEAN arg1 引数と arg2 引数は、以下のタイプのいずれかに解析されます。
-
整数。正、または負の、18 桁までの 10 進数の整数です。数 0 から 9 を除く文字、またはオプションで 1 つ、または複数の先頭のプラス符号やマイナス符号を許可しません。先頭のゼロは無視されます。
-
文字列。文字列の長さもコンテンツも任意ですが、文字列は引用符で囲まれる必要があります。文字列 “123” と整数 123 は同じものではありません。NULL 文字列も使用できますが、arg2 が NULL 文字列の場合は、 bit_op の値に関係なく、$ZBOOLEAN は必ず arg1 の値を返します。
-
符号付き文字列。先頭にプラス符号、またはマイナス符号が付く文字列は、文字列のコンテンツにかかわらず、整数として解析されます。符号付き文字列は、整数の長さ規約に従います。符号付き NULL 文字列は、ゼロと同じです。
arg1 と arg2 を両方とも整数に解析するか、または、両方とも文字列に解析することを強くお勧めします。通常、arg1 と arg2 は同じデータタイプです。$ZBOOLEAN 演算で整数と文字列を結合すると、多くの場合で有用な結果を得ることができなくなります。
例
以下の 3 つの例は、すべて同じ AND 演算を表します。これらの例では、小文字の ASCII 値と下線文字 (_) の ASCII 値に対し AND 演算を実行すると、対応する ASCII 値の大文字が得られます。
WRITE $ZBOOLEAN("abcd","_",1)
これは、ABCD を表示します。
小文字の "a" = [01100001] (ASCII 10 進数 97)
下線文字 "_" = [01011111] (ASCII 10 進数 95)
大文字の "A" = [01000001] (ASCII 10 進数 65)
以下の演算例は、上記の AND 演算と同じですが、ASCII 10 進数値を引数として使用します。関数 $ASCII("a") は、最初の引数に対し 97 という 10 進数の値を返します。
WRITE $ZBOOLEAN($ASCII("a"),95,1)
これは、65 を表示します。
以下の例は、2 番目の引数として $CHAR 値を使用して、同じ AND 演算を実行します。
WRITE $ZBOOLEAN("a",$CHAR(95),1)
これは、A を表示します。
以下は、論理 OR の例を示しています。
WRITE $ZBOOLEAN(1,0,7)
これは、1 を表示します。
WRITE $ZBOOLEAN(1,1,7)
これは、1 を表示します。
WRITE $ZBOOLEAN(2,1,7)
これは、3 を表示します。
WRITE $ZBOOLEAN(2,2,7)
これは、2 を表示します。
WRITE $ZBOOLEAN(3,2,7)
これは、3 を表示します。
以下の論理和の例は、文字列比較と数値比較との間の相違を示します。
WRITE $ZBOOLEAN(64,255,7)
2 つの値を数値として比較し、255 を表示します。
WRITE $ZBOOLEAN("64","255",7)
2 つの値を文字列として比較し、65 を表示します。
WRITE $ZBOOLEAN(+"64",+"255",7)
プラス符号により、強制的に 2 つの値が数値として比較され、255 を表示します。
以下は、排他的 OR の例を示しています。
WRITE $ZBOOLEAN(1,0,6)
これは、1 を表示します。
WRITE $ZBOOLEAN(1,1,6)
これは、0 を表示します。
WRITE $ZBOOLEAN(2,1,6)
これは、3 を表示します。
WRITE $ZBOOLEAN(2,2,6)
これは、0 を表示します。
WRITE $ZBOOLEAN(3,2,6)
これは、1 を表示します。
WRITE $ZBOOLEAN(64,255,6)
これは、191 を表示します。
以下の例は、すべてのバイトが 1 に設定された 4 バイトのエンティティを示しています。
WRITE $ZBOOLEAN(5,1,15)
これは、-1 を表示します。
以下の例では、x を、すべてのビットが 1 に設定された 3 バイトの文字列に設定します。
SET x=$ZBOOLEAN("abc",0,15)
WRITE !,$LENGTH(x)
WRITE !,$ASCII(x,1)," ",$ASCII(x,2)," ",$ASCII(x,3)
最初の WRITE は 3 を、2 番目の WRITE は 255 255 255 を表示します。
整数の処理
$ZBOOLEAN はビット単位演算を実行する前に、それぞれの数値をサイズによって 8 バイトまたは 4 バイトの符号付きバイナリ値に変換します。$ZBOOLEAN は、常に数値を一連のバイトとして変換します。ブーリアン演算は、これらのバイト文字列を、文字列引数として使用します。結果のタイプは、arg1 のタイプと同じです。
arg1、arg2 の一方が数値であり、8 バイトの符号付き整数 (18 小数桁より大きい) で表示できない場合は、<FUNCTION> エラーが発生します。arg1、arg2 の両方が数字であり、一方を 8 バイトで表す必要がある場合、両方とも 8 バイトのバイナリ値として解釈されます。
以上の変換が完了した後、arg1 と arg2 に、任意のブーリアンの組み合わせが 1 ビットずつ割り当てられて結果が生成されます。(上記の数値データの変換後) 返される結果は、常に arg1 と同じ長さになります。arg2 が arg1 より短い場合は、arg2 は、連続した arg1 の部分文字列と、左から右へ繰り返して組み合わされます。
使用しているマシンのネイティブのバイト・オーダーにかかわらず、$ZBOOLEAN は数値を一連のバイトとして、常に下位バイトから順にリトルエンディアンで変換します。