ObjectScript のネイティブのビット文字列
ObjectScript は、ネイティブのビット文字列形式と、この形式を操作する関数を提供します。
ビット文字列は、番号付きビットとブーリアン値の論理セットを表します。文字列内のビットには、ビット番号 1 から始まる番号が付けられます。ブーリアン値 1 に明示的に設定されていない番号付きビットは、0 と評価されます。したがって、明示的に設定された番号付きビット以外のものを参照すると、ビット値 0 が返されます。
ビット文字列には論理長があります。これは、0 または 1 のいずれかに明示的に設定された最上位のビット位置です。この論理長には、$BITCOUNT 関数を使用することでのみアクセスできます。ただし、通常は、アプリケーション・ロジックでは論理長を使用しないでください。ビット文字列関数の場合、未定義のグローバル変数またはローカル変数は、ビット値 0 を返す指定された番号付きビットを持ち、$BITCOUNT 値が 0 であるビット文字列と同等です。
ビット文字列は、内部形式を持つ通常の ObjectScript 文字列として保存されます。この内部文字列の表現には、ビット文字列関数ではアクセスできません。この内部形式のため、ビット文字列の文字列長は、文字列内のビット数に関する情報を判断する際に意味がありません。
ビット文字列の内部形式という理由により、連結演算子をビット文字列と共に使用することはできません。これを実行しようとすると、<INVALID BIT STRING> エラーが返されます。
同じ状態 (同じブーリアン値を持つ) の 2 つのビット文字列が、異なる内部文字列表現を持つ場合があります。したがって、文字列表現は、アプリケーション・ロジックで調査したり、比較したりしないでください。
ビット文字列関数の場合、未定義の変数として指定されたビット文字列は、すべてのビットが 0 で長さが 0 のビット文字列と同等です。
通常の文字列とは異なり、ビット文字列では、空の文字列と文字 $CHAR(0) は互いに等しく、0 ビットを表すものとして処理されます。これは、$BIT では非数値の文字列がすべて 0 として処理されるからです。したがって、以下のようになります。
SET $BIT(bstr1,1)=""
SET $BIT(bstr2,1)=$CHAR(0)
SET $BIT(bstr3,1)=0
IF $BIT(bstr1,1)=$BIT(bstr2,1) {WRITE "bitstrings are the same"} ELSE {WRITE "bitstrings different"}
WRITE $BITCOUNT(bstr1),$BITCOUNT(bstr2),$BITCOUNT(bstr3)
トランザクション中にグローバル変数で設定されたビットは前の値に戻され、その後にトランザクションのロールバックが行われます。ただし、グローバル変数のビット文字列は、ロールバック操作によって前の文字列長または前の内部文字列表現に戻りません。ローカル変数は、ロールバック操作によって元に戻りません。
論理ビットマップ構造は、ビット文字列の配列で表現できます。この配列の各要素が固定のビット数を持つ 1 つの「チャンク」を表しています。未定義はすべてのビットが 0 のチャンクと同等であるため、配列はスパースになることがあります。すべてのビットが 0 のチャンクを表す配列要素は、存在している必要は一切ありません。この理由および上記のロールバック動作のため、アプリケーション・ロジックでは、ビット文字列の長さや $BITCOUNT(str) または $BITCOUNT(str,0) を使用してアクセスできる 0 値のビットのカウントに依存しないようにする必要があります。