$BITLOGIC (ObjectScript)
構文
$BITLOGIC(bitstring_expression,length)
引数
引数 | 説明 |
---|---|
bitstring_expression | 1 つ以上のビット文字列変数と論理演算子 &、|、^、および ~ で構成した論理式。ローカル変数、プロセス・プライベート・グローバル、グローバル、オブジェクト・プロパティ、または定数 "" として指定されます。NULL 文字列 ("") のビット文字列長は 0 です。ビット文字列を返す関数 ($FACTOR など) を使用してビット文字列を指定することはできません。 |
length | オプション — 取得したビット文字列の長さをビットで表したもの。length が指定されていない場合、既定は bitstring_expression の最長のビット文字列長になります。 |
概要
$BITLOGIC は、1 つまたは複数のビット文字列値に対し、bitstring_expression で指定されたようにビット演算を実行し、結果のビット文字列を返します。
ビット文字列は、一連のビットとして解釈されるコード化 (圧縮された) 文字列です。$BIT、$FACTOR、または $BITLOGIC を使用して作成されたビット文字列、または NULL 文字列 ("") だけが、$BITLOGIC 関数に提供されます。一般的に、ビット文字列はインデックス演算に使用されます。詳細は、"$BIT" の "ビット文字列関数の概要" を参照してください。
$BITLOGIC と $ZBOOLEAN が使用するデータ形式は異なります。一方の結果を、もう一方の入力として使用することはできません。
ビット文字列の最適化
基本的な $BITLOGIC 操作は $BITLOGIC(a) です。この操作は何も行わないように見えます。ビット文字列 a が入力され、同じビット文字列 a が出力されます。しかし、$BITLOGIC は、いくつかの圧縮アルゴリズムから選択することによってこれが最適化するビット文字列圧縮を実行します。したがって、ビット文字列 a は、このビット文字列が作成されてから実質的な変更が加えられる場合、$BITLOGIC 経由でこのビット文字列を渡すことにより、ビット文字列の最適化を再度行うことができます。詳細は "$BIT" を参照してください。
例えば、多数の削除操作の後、インデックス・ビット文字列は、全体的にまたは大部分がゼロで構成されているスパース・ビット文字列になる場合があります。$BITLOGIC 経由でこのインデックス・ビット文字列を渡すことにより、パフォーマンスをかなり向上させることができます。
ビット文字列の論理演算子
$BITLOGIC は以下のテーブルのビット文字列演算子のみを評価します。
演算子 | 意味 |
---|---|
& | AND |
| | OR |
^ | XOR (排他的 OR) |
~ | NOT (1 の補数) |
bitstring_expression は現在の最大 31 のビット文字列まで、単一のビット文字列 (~A)、2 つのビット文字列 (A&B)、または 2 つ以上のビット文字列 (A&B|C) を含めることができます。評価は左から右の順に行われます。論理演算子は標準的な ObjectScript の演算子の順序に従って、bitstring_expression 内で括弧によってグループ化されることもあります。$BITLOGIC 内で使用されている変数が未定義の場合は、NULL 文字列 ("") として処理されます。
$BITLOGIC は NULL 文字列を、すべてのビットが 0 に設定されている、長さ不定のビット文字列として処理します。
$BITLOGIC に 2 つ以上のビット文字列オペランドを指定する場合は、中間結果を保持するために一時的なビット文字列を作成する必要があります。異常な状況下では (多くのビット文字列や極端に大きいビット文字列など)、このような一時的なビット文字列を保持するために割り当てられている領域が使い尽くされる場合があります。ビット文字列の組み合わせの処理ではこのような制限はないので、大きなビット文字列の処理を行うことができます。
NOT (~) 演算子は単項演算子 (例えば ~A) として使用されたり、他の演算子との組み合わせ (例えば A&~B) で使用されます。この演算子は、1 をすべて 0 に、0 をすべて 1 に変換する文字列上の補数演算を実行します。複数の NOT 演算子も使用可能です (例えば ~~~A)。
length 引数
length が指定されていない場合、既定は bitstring_expression の最長のビット文字列長になります。
length が指定されている場合は、結果のビット文字列の論理長を指定します。
-
length が bitstring_expression 内のビット文字列より 1 以上大きい場合、ビット文字列論理演算が実行される前に、これらのビット文字列は、その文字列長までゼロで埋められます。
-
length が 1 つ以上の bitstring_expression 内のビット文字列よりも小さい場合、ビット文字列論理演算が実行される前に、これらのビット文字列はその文字列まで切り捨てられます。
-
length がゼロの場合、ビット文字列長 0 (NULL 文字列) を返します。
例
以下は、複数の単純なビット文字列を作成し、その文字列で $BITLOGIC を使用する例を示しています。
// Set a to [1,1]
SET $BIT(a,1) = 1
SET $BIT(a,2) = 1
// Set b to [0,1]
SET $BIT(b,1) = 0
SET $BIT(b,2) = 1
WRITE !,"bitstring a=",$BIT(a,1),$BIT(a,2)
WRITE !,"bitstring b=",$BIT(b,1),$BIT(b,2)
SET c = $BITLOGIC(~b)
WRITE !,"The one's complement of b=",$BIT(c,1),$BIT(c,2)
// Find the intersection (AND) of a and b
SET c = $BITLOGIC(a&b) // c should be [0,1]
WRITE !,"The AND of a and b=",$BIT(c,1),$BIT(c,2)
SET c = $BITLOGIC(a&~b) // c should be [1,0]
WRITE !,"The AND of a and ~b=",$BIT(c,1),$BIT(c,2)
// Find the union (OR) of a and b
SET c = $BITLOGIC(a|b) // c should be [1,1]
WRITE !,"The OR of a and b=",$BIT(c,1),$BIT(c,2)
SET c = $BITLOGIC(a^b) // c should be [1,0]
WRITE !,"The XOR of a and b=",$BIT(c,1),$BIT(c,2)
QUIT
以下の例は、入力ビット文字列より大きい length を指定した場合の結果を示します。ビット文字列論理演算が実行される前に、文字列がゼロで埋められます。
// Set a to [1,1]
SET $BIT(a,1) = 1
SET $BIT(a,2) = 1
WRITE !,"bitstring a=",$BIT(a,1),$BIT(a,2)
SET c = $BITLOGIC(~a,7)
WRITE !,"~a (length 7)="
WRITE $BIT(c,1),$BIT(c,2),$BIT(c,3),$BIT(c,4)
WRITE $BIT(c,5),$BIT(c,6),$BIT(c,7),$BIT(c,8)
ここでは、11 の 1 の補数 (~) は 0011111 です。ビット 3 から 7 は、~ 演算が実行される前は、ゼロに設定されていました。さらに、この例では 8 番目のビットが表示されます。このビットは指定した文字列長を超えているので、$BITLOGIC 操作の影響を受けません。0 として表示されます。
以下の例は、入力ビット文字列より小さい length を指定した場合の結果を示します。ビット文字列論理演算が実行される前に、ビット文字列は指定した長さに切り捨てられます。指定した長さを超えるビットはすべて既定で 0 になります。
// Set a to [1,1,1]
SET $BIT(a,1) = 1
SET $BIT(a,2) = 1
SET $BIT(a,3) = 1
WRITE !,"bitstring a=",$BIT(a,1),$BIT(a,2),$BIT(a,3)
SET c = $BITLOGIC(a,2)
WRITE !," a (length 2)="
WRITE $BIT(c,1),$BIT(c,2),$BIT(c,3),$BIT(c,4)
SET c = $BITLOGIC(~a,2)
WRITE !,"~a (length 2)="
WRITE $BIT(c,1),$BIT(c,2),$BIT(c,3),$BIT(c,4)
以下の例では、length が指定されていない場合、既定は最長のビット文字列長になることを示しています。ビット文字列論理演算が実行される前に、短いビット文字列はゼロで埋められます。
// Set a to [1,1,1]
SET $BIT(a,1) = 1
SET $BIT(a,2) = 1
SET $BIT(a,3) = 1
// Set b to [1,1]
SET $BIT(b,1) = 1
SET $BIT(b,2) = 1
SET c = $BITLOGIC(a&~b)
WRITE !," a&~b="
WRITE $BIT(c,1),$BIT(c,2),$BIT(c,3)
SET c = $BITLOGIC(a&~b,3)
WRITE !,"a&~b,3="
WRITE $BIT(c,1),$BIT(c,2),$BIT(c,3)
ここでは、2 つの $BITLOGIC 操作 (length 引数が指定されている場合と指定されていない場合) は、両方とも同じ値 001 を返します。