Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

$ZBOOLEAN

ビット単位論理演算関数

Synopsis

$ZBOOLEAN(arg1,arg2,bit_op)
$ZB(arg1,arg2,bit_op)

パラメータ

arg1 最初の引数。整数または文字列、あるいは、整数または文字列に解析される変数または式のいずれかです。すべての文字は 0 ~ 255 の ASCII 値 である必要があります。浮動小数点数は使用できません。
arg2 2 番目の引数。整数または文字列、あるいは、整数または文字列に解析される変数または式のいずれかです。すべての文字は 0 ~ 255 の ASCII 値 である必要があります。浮動小数点数は使用できません。
bit_op 実行される演算を示す整数 (以下のテーブルを参照してください)。許可される値は、0 から 15 (包含的) です。

概要

$ZBOOLEAN は、2 つの引数 arg1arg2 に対して、bit_op によって指定されたビット単位論理演算を実行します。$ZBOOLEAN は、 bit_op 値で指定されたように arg1arg2 のビット単位結合の結果を返します。ZZDUMP コマンドを使用して、結果を表示することができます。

$ZBOOLEAN は、文字列または数字のいずれかに対して演算を実行します。文字列の場合、文字列内の各文字に対して、論理積と論理和を実行します。数字の場合、数字全体を 1 つの単位として、論理積と論理和を実行します。数値文字列を数字に評価させるには、文字列の前にプラス符号 (+) を付けます。

Note:

$ZBOOLEAN は ASCII 255 より大きな値の Unicode 文字をサポートしません。$ZBOOLEAN を 16 ビットの Unicode 文字の文字列に適用するには、まず $ZWUNPACK を使用し、次に $ZBOOLEAN、さらに $ZWPACK を続ける必要があります。

$ZBOOLEAN$BITLOGIC が使用するデータ形式は異なります。一方の結果を、もう一方の入力として使用することはできません。

このビット単位演算では、arg1arg2 のブーリアンの組み合わせが 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)

詳細は、"Caché ObjectScript の使用法" の "演算子" の章を参照してください。

すべての $ZBOOLEAN 演算は、bit_op 値 0、3、5、10、12、および 15 を含む arg1arg2 の両方を解析します。

$ZBOOLEANarg1 パラメータと arg2 パラメータは、以下のタイプのいずれかに解析されます。

  • 整数。正、または負の、18 桁までの 10 進数の整数です。数 0 から 9 を除く文字、またはオプションで 1 つ、または複数の先頭のプラス符号やマイナス符号を許可しません。先頭のゼロは無視されます。

  • 文字列。文字列の長さもコンテンツも任意ですが、文字列は引用符で囲まれる必要があります。文字列 “123” と整数 123 は同じものではありません。NULL 文字列も使用できますが、arg2 が NULL 文字列の場合は、 bit_op の値に関係なく、$ZBOOLEAN は必ず arg1 の値を返します。

  • 符号付き文字列。先頭にプラス符号、またはマイナス符号が付く文字列は、文字列のコンテンツにかかわらず、整数として解析されます。符号付き文字列は、整数の長さ規約に従います。符号付き NULL 文字列は、ゼロと同じです。

arg1arg2 を両方とも整数に解析するか、または、両方とも文字列に解析することを強くお勧めします。通常、arg1arg2 は同じデータタイプです。$ZBOOLEAN 演算で整数と文字列を結合すると、多くの場合で有用な結果を得ることができなくなります。

パラメータ

arg1

ビット単位論理式の中の 1 番目の引数。文字列では、返り値の長さは常に、この引数の長さと同じです。

arg2

ビット単位論理式の中の 2 番目の引数。

bit_op

実行されるビット単位論理演算。0 から 15 (包含的) の数値コードとして指定されます。このコードはビット・マスクとして処理されるので、値は 16=0、17=1、18=2 となります。

bit_op 値 0 と 15 は定数値を返しますが、引数の評価も行います。arg1 が整数 (または符号付き文字列) の場合、bit_op 値 0 は 0 を返し、bit_op 値 15 は -1 を返します (0 の 1 の補数)。arg1 が文字列の場合、bit_op 0 は arg1 の各文字に対する低値 (hex 00) を返し、bit_op 15 は arg1 の各文字に対する高値 (hex FF) を返します。arg2 が NULL 文字列 ("") の場合、両方の演算は arg1 のリテラル値を返します。

bit_op 値 3、5、10、および 12 は、引数のいずれかに対してのみ論理演算を実行しますが、評価は両方の引数に対して行います。

  • bit_op=3 は常に、arg2 の値に関係なく arg1 の値を返します。

  • bit_op=5 は、2 つの引数が同じデータ型のとき、arg2 の値を返します。しかし、引数のうち 1 つが文字列で、もう 1 つの引数が整数 (または符号付き文字列) の場合、結果は予測不可能です。arg2 が NULL 文字列の場合、$ZBOOLEANarg1 のリテラル値を返します。

  • bit_op=10 は、両方の引数が整数の場合に、arg2 の 1 の補数を返します。arg1 が文字列の場合、演算は arg1 の各文字に対する高順序文字を返します。arg2 が文字列で arg1 が整数の場合、ビット単位演算は arg2 文字列に対して実行されます。arg2 が NULL 文字列の場合、$ZBOOLEANarg1 のリテラル値を返します。

  • bit_op=12 は、その値が整数 (または符号付き文字列) の場合、NULL 文字列を除く任意の arg2 の値に対して、arg1 の 1 の補数を返します。arg1 が文字列の場合、演算は arg1 の各文字 の 1 の補数を (hex 値として) 返します。arg2 が NULL 文字列の場合、$ZBOOLEANarg1 のリテラル値を返します。

以下の 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 のタイプと同じです。

arg1arg2 の一方が数値であり、8 バイトの符号付き整数 (18 小数桁より大きい) で表示できない場合は、<FUNCTION> エラーが発生します。arg1arg2 の両方が数字であり、一方を 8 バイトで表す必要がある場合、両方とも 8 バイトのバイナリ値として解釈されます。

以上の変換が完了した後、arg1arg2 に、任意のブーリアンの組み合わせが 1 ビットずつ割り当てられて結果が生成されます。(上記の数値データの変換後) 返される結果は、常に arg1 と同じ長さになります。arg2arg1 より短い場合は、arg2 は、連続した arg1 の部分文字列と、左から右へ繰り返して組み合わされます。

使用しているマシンのネイティブのバイト・オーダーにかかわらず、$ZBOOLEAN は数値を一連のバイトとして、常に下位バイトから順にリトルエンディアンで変換します。

$ZBOOLEAN 値の内部構造

以下の表では、$ZBOOLEAN の内部法則を表しています。$ZBOOLEAN を使用する際に、これらの法則を理解する必要はありません。参照としてご利用ください。

arg1 と arg2 内の 2 つのビットを比較する場合、起こりうる組み合わせは 4 種類あります。ブーリアン演算は、下記の表に示されるとおり、bit_op がビット・マスクを持つ場合のみ、True (1) という結果を生じます。

arg1 のビット arg2 のビット bit_op 10 進数のビット・マスク bit_op 2 進数のビット・マスク
0 0 8 1000
0 1 4 0100
1 0 2 0010
1 1 1 0001

EQV および IMP 論理演算子

$ZBOOLEAN は、EQV および IMP 論理演算子を直接サポートしません。これらの論理演算子は、以下のように定義されます。

  • EQV は、2 つの式間の論理等値です。$ZBOOLEAN(arg1,arg2,9) で表されます。これは、論理的には ~(arg1 ^ arg2) で、((~arg1) & (~arg2)) ! と論理的に同等です (arg1 & arg2)。

  • IMP は、2 つの式間の論理含意です。$ZBOOLEAN(arg1,arg2,13) で表されます。これは、(~arg1) ! arg2 と論理的に同等です。

関連項目

FeedbackOpens in a new tab