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?

$BIT

$BIT は、ビット文字列内の指定された位置のビット値を返すか、または設定します。

Synopsis

$BIT(bitstring,position)

SET $BIT(bitstring,position) = value

パラメータ

bitstring

ビット文字列として評価される式。

$BIT の場合、bitstring にはビット文字列に解決される任意の式を指定できます。これには、任意のタイプの変数、$FACTOR、ユーザ定義関数、および oref.prop..propi%prop プロパティ参照が含まれます。

SET $BIT の場合、bitstring には i%Prop() プロパティ・インスタンス変数を含む任意のタイプの変数を指定できます。

position bitstring 内のビット位置。 リテラルまたは正の整数に評価される式。ビット位置は 1 からカウントされます。
value position で設定するビット値。リテラルまたは整数 0 か 1 に評価される式。

概要

$BIT は、圧縮ビット文字列からビット値を返すために使用されます。$BIT (bitstring,position) は、与えられたビット文字列式 bitstring 内で、指定された位置 position のビット値 (0 または 1) を返します。position に対して値が定義されていない場合、$BIT はその position に対して 0 を返します。position は 1 からカウントされ、position が 1 未満 (0 または負の数) であるか、またはビット文字列の長さよりも長い場合、関数は 0 を返します。

bitstring が未定義の変数であるか NULL 文字列 ("") である場合、$BIT 関数は 0 を返します。bitstring が有効なビット文字列ではない場合、<INVALID BIT STRING> エラーが発生します。

$BIT 関数およびその他のビット文字列関数の概説は、"ビット文字列関数の概要" を参照してください。

SET $BIT

SET $BIT は、bitstring の圧縮ビット文字列で指定されたビット値を設定するために使用されます。bitstring が定義されていない場合、SET $BIT は、bitstring 変数を圧縮ビット文字列として定義し、指定されたビット値を設定します。

SET $BIT(bitstring,position) = valuebitstring によって指定されたビット文字列に対してアトミック・ビット・セットを実行します。value が 1 の場合、位置 position のビットは 1 に設定されます。value が 0 の場合、ビットはクリアされます (0 に設定)。整数の value 値 0 または 1 のみを使用してください。Caché は、“true” や “false” などの非数値をすべて 0 に変換します。

ビットの position は 1 からカウントされます。bitstring が、指定された position よりも短い場合、ビット文字列の指定された位置に、Caché により 0 ビットがパディングされます。position に 0 を指定すると、システムによって <VALUE OUT OF RANGE> エラーが生成されます。

bitstring 変数は、未定義の変数、ビット文字列値に既に設定されている変数、または空の文字列 ("") に設定されている変数のいずれかにする必要があります。ビット文字列以外の値に既に設定されている変数で SET $BIT を使用しようとすると、<INVALID BIT STRING> エラーが発生します。

SET $BIT bitstring パラメータは oref.property または .. property 構文をサポートしていません。

SET $BIT bitstring パラメータは、ローカル (非継承) プロパティとスーパー・クラスから継承されたプロパティの両方の i%property 構文をサポートします。継承されたプロパティを既存のコードに設定しようとして <FUNCTION> エラーが生成される場合、ルーチンをリコンパイルするとこのエラーが解消され、継承されたプロパティを設定できるようになります。

ビット文字列の表示

例に示されているように、WRITE を使用することで、ビット文字列の各ビットの内容を $BIT の返り値として表示できます。

Caché には、変数の内容を表示するためのコマンドがいくつか用意されています。ただし、$BIT のビット文字列は圧縮バイナリ文字列であるため、WRITE は実用的な値を表示しません。ZZDUMP は、16 進表現の圧縮バイナリ文字列を表示しますが、これもほとんどの目的において実用的な値ではありません。

ZWRITE および ZZWRITE は、10 進表現の圧縮バイナリ文字列を $ZWCHAR ($zwc) 2 バイト (ワイド) 文字として表示します。ただし、コンマ区切りリストとして、左から右の順に、圧縮されていない “1” ビットをリストするコメントも表示します。3 つ以上の連続した “1” ビットがある場合は、それらを 2 ドット構文 (n..m) を使用して範囲 (n と m も範囲に含む) としてリストします。例えば、ビット文字列 [1,0,1,1,1,1,0,1] は、/*$bit(1,3..6,8)*/ と表示されます。ビット文字列 [1,1,1,1,1,1,1,1] は、/*$bit(1..8)*/ と表示されます。ビット文字列 [0,0,0,0,0,0,0,0] は、/*$bit()*/ と表示されます。

$DATA は、 [0,0,0,0,0,0,0,0] のようなすべてがゼロのビット文字列を含め、圧縮バイナリ文字列変数について 1 を返します。$GET は、その値に関わらず、圧縮バイナリ文字列について空の文字列を返します。$GET は、未定義の変数についても空の文字列を返します。

以下の例で、設定されていないビットは常に 0 の値を持つことに注意してください。

次の例では、SET $BIT を使用して、圧縮ビット文字列を作成します。その後、$BIT を繰り返し呼び出して、ビット文字列のビットを表示します。

  SET $BIT(a,1) = 0
  SET $BIT(a,2) = 0
  SET $BIT(a,3) = 1
  SET $BIT(a,4) = 0
  SET $BIT(a,5) = 0
  SET $BIT(a,6) = 1
  SET $BIT(a,7) = 1
  SET $BIT(a,8) = 0
  // Test single bits within the bitstring
  WRITE "bit #2 value: ",$BIT(a,2),!
  WRITE "bit #7 value: ",$BIT(a,7),!
  WRITE "bit #8 value: ",$BIT(a,8),!
  WRITE "bit #13 value: ",$BIT(a,13),!
  // Write the bitstring
  WRITE "bitstring value: "
  FOR x=1:1:8 {WRITE $BIT(a,x) }
  WRITE !!,"compressed bitstring: "
  ZZDUMP a

Caché は、ビット文字列の指定した位置に 0 ビットを付け加えるため、以下の例では、まったく同じビット文字列データ値が返されています。ただし、#8 ビットが定義されていないため、圧縮ビット文字列 a は圧縮ビット文字列 b と同一ではないことに注意してください。

  SET $BIT(b,3) = 1
  SET $BIT(b,6) = 1
  SET $BIT(b,7) = 1
  // Test single bits within the bitstring
  WRITE "bit #2 value: ",$BIT(b,2),!
  WRITE "bit #7 value: ",$BIT(b,7),!
  WRITE "bit #8 value: ",$BIT(b,8),!
  WRITE "bit #13 value: ",$BIT(b,13),!
  // Write the bitstring
  WRITE "bitstring value: "
  FOR x=1:1:8 {WRITE $BIT(b,x) }
  WRITE !!,"compressed bitstring: "
  ZZDUMP b

このため、割り当て済みの値が 0 であっても、ビット文字列で最大定義済みビットを常に明示的に設定するプログラミング方法が推奨されます。

以下の例に示すように、FOR expr コンマ区切りリストを使用して、複数のビットを設定できます。

  FOR i=3,6,7 { SET $BIT(b,i) = 1 }
  // Test single bits within the bitstring
  WRITE "bit #2 value: ",$BIT(b,2),!
  WRITE "bit #7 value: ",$BIT(b,7),!
  WRITE "bit #8 value: ",$BIT(b,8),!
  WRITE "bit #13 value: ",$BIT(b,13),!
  // Write the bitstring
  WRITE "bitstring value: "
  FOR x=1:1:8 {WRITE $BIT(b,x) }
  WRITE !!,"compressed bitstring: "
  ZZDUMP b

次の例では、$BIT を連続して呼び出すことにより、$FACTOR によって生成されたビット文字列のビットが返されます。

  FOR i=1:1:32 {WRITE $BIT($FACTOR(2*31-1),i) }

次の例は、ランダムな 16 ビットのビット文字列を返します。

   SET x=$RANDOM(65536)
   FOR i=1:1:16 {WRITE $BIT($FACTOR(x),i) }

ビット文字列関数の概要

ビット文字列関数は、コード化されたビット単位のデータを計算します。ビット文字列は、すべての ObjectScript コマンドや関数と共に使用できますが、通常ビット関数のコンテキスト内でのみ意味を持ちます。

$BIT ビット文字列関数は、アトミック演算を実行します。したがって、ビット文字列演算を実行するときにロックは必要ありません。

$BIT ビット文字列関数は、ビット文字列の内部圧縮を実行します。したがって、ビット文字列の実際のデータの長さと、その物理的なスペース割り当てとは、異なる可能性もあります。$BIT ビット文字列関数はビット文字列のデータの長さを使用します。ほとんどの場合、物理的なスペース割り当てはユーザから見えないところにあります。ビット文字列圧縮は、$BIT 関数のユーザからは見えないところで行われます。

しかし、圧縮 2 進数の表現は各ビット文字列ごとに最適化されるため、(別々に作成された) "同じ" 文字列が同じ内部表現を持つとは限りません。Caché は、スパース・ビット文字列と非スパース・ビット文字列の両方に対する最適化のために、4 つの別個のビット文字列内部表現から選択します。したがって、各ビットにおけるマッチング演算で期待どおりの結果が得られても、文字列全体を比較して同様の結果が得られるとは限りません。

$BIT ビット文字列関数は、Caché 用に最大ビット長 262,104 ビット (32763 × 8) をサポートしています (従来のインターシステムズ製品とは異なり、Caché では、ビット文字列よりも長いビットを操作してもエラーは発生しません)。ただし、パフォーマンス上の理由から、長いビット文字列を 65,280 ビット未満のチャンクに分割することを強くお勧めします。これが、単一の 8KB データベース・ブロック内に収めることができる最大ビット数です。

ビット文字列のビットは左から右に順番に並び、一番左のビットは位置 1 となります。すべてのビット文字列は左から右に比較されます。

例では、ビット文字列はコンマで区切られたビットを使用し、一致する中括弧 ( {...} ) 内に示されています。例えば、1 ビット 4 つのビット列は {1,1,1,1} になり、最下位ビットが右になります。

すべてのビット文字列関数で、bitstring という変数はビット文字列であり、値、変数、または式として指定できます。

$BIT 関数および $ZBIT 関数

$BIT 関数は、初期の $ZBIT 関数を置換します。$ZBIT 関数は、従来のアプリケーションでも継続してサポートされますが、新しいコードを記述する場合、この $BIT 関数のみを使用してください。$BIT 関数と $ZBIT 関数には互換性がなく、$BIT 関数はビット文字列を圧縮しますが、$ZBIT 関数は圧縮しません。したがって、2 種類のビット文字列関数は、同じビット文字列上では使用しないでください。これを実行しようとすると、<INVALID BIT STRING> エラーが返されます。

$SYSTEM.Bit.ZBitToBit()Opens in a new tab メソッドを使用して、$ZBIT 形式ビット文字列を $BIT 形式ビット文字列に変換できます。詳細は、以下の例を参照してください。

ZBitSet
  SET zb=$ZBITSTR(4,1)       /* the $ZBIT string 1111 */
  SET zbnew=$ZBITSET(zb,2,0) /* the $ZBIT string 1011 */
ZBitToBit
  SET bb=$SYSTEM.Bit.ZBitToBit(zbnew)
  WRITE !,$BIT(bb,1),$BIT(bb,2),$BIT(bb,3),$BIT(bb,4)

関連項目

FeedbackOpens in a new tab