$ZBITで始まる関数のシリーズは、ビットストリームの操作をします。内部的にGT.Mはビット文字列の形式でビットストリームが格納します。ビット文字列は、1番目のバイトが、ビットストリームの一部ではない最終バイト内で、後端ビットの数を指定するような方法で、ビットストリームを埋め込みます。この方法では、GT.Mは、バイト形式で8ビットの倍数以外の長さのビットストリームを保存することができます。したがって、たとえば、1 (1)が最終ビットが除外されていることを示し、そして、7 (7)が最終バイトの中の唯一第1ビットがビットストリームに属していることを示している間に、ゼロ(0)値の第1バイトは最終バイト中のすべてのビットがビットストリームに属していることを示します。
もしビット文字へ文字列を変換する必要がある場合は、すべての$ZBIT関数はそれを認識できるように、その文字列に先頭バイトを追加します。これを行う最も一般的かつ簡単な方法は、n の値がゼロからセブン(0-7) で、文字列の最前に$CHAR(n) を連結することです - 最も一般的にゼロ(0)もし文字列を予期しているルーチンへ引数としてビット文字列を渡す場合に、それが文字列を認識できるように、その呼び出しルーチンは、1番目の(そしておそらく最終の)バイトを取り除く必要があります。
このセクションでは、すべての$ZBIT関数の説明と、ビットストリームに文字に訳すこととコード化された値を返すための$ZBIT関数の使用例が含まれています。しかし、これらの関数の多くの適切な使用は、チェックサムの構成、(スキャン(scan)からのピクセル(pixel)と呼ばれる)ビットデータのハンドリング、または、ビット指向(bit-oriented)の引数を必要とするルーチンのインタフェースが含まれす。
2つのビット文字列の論理的ANDを実行し、2つの引数のうち短い方の長さに等しいビット文字列を返します(セットビットを持つ両方の入力文字列ともこれらの位置にセットビットが含んでいる)。結果が得られた文字列の中で、入力文字列の内どちらかが消去された1ビットを持っている位置に、また消去された複数ビットを持っている位置にも、一致している位置に置きます。
$ZBITAND()関数のフォーマット:
$ZBITAND(expr1,expr2)
1番目の式(expr1)は、AND演算に入力されているビットの文字列の1つを指定します。
2番目の式(expr2)は、AND演算に入力されている他のビット文字列を指定します。
GTM> ; The binary representation of A is 01000001 GTM>Set BITSTRINGB=$zbitset($zbitset($zbitstr(8,0),2,1),7,1) ; The binary representation of B is 01000010 GTM>set BITSTRINGAB=$zbitand(BITSTRINGA,BITSTRINGB) GTM>for i=1:1:8 write $zbitget(BITSTRINGAB,I) 01000000
この例では、AとBの間でビット単位のAND演算を実行するように、$ZBITANDを使用しています。
A= 01000001 B= 01000010 A と Bとのビット単位のANDは = 0100000
ビット文字列の中のONビットの数を返します。
$ZBITCOUNT()関数のフォーマット:
$ZBITCOUNT(expr)
式(expr)は、調べるビット文字列を指定します。
例:
GTM>set BITSTRINGA=$ZBITSET($ZBITSET($ZBITSTR(8,0),2,1),8,1) ; The binary representation of A is 01000001 GTM>set BITSTRINGB=$zbitset($zbitset($zbitstr(8,0),2,1),7,1) ; The binary representation of B is 01000010 GTM>Set BITSTRINGC=$zbitor(BITSTRINGA,BITSTRINGB) ; A OR B=01000011 GTM>write $zbitcount(BITSTRINGA) 2 GTM>write $zbitcount(BITSTRINGB) 2 GTM>write $zbitcount(BITSTRINGC) 3 GTM>
この例では、BITSTRINGA、BITSTRINGB、BITSTRINGCの中のビットがONの数が表示されます。
ビット文字列上で$FIND関数に似た機能を実行します。これは、指定された開始位置(またはその後ろ)で発生した真理値式(tvexpr)以上の1番目の位置より後ろの位置を識別する整数を返します。
$ZBITFIND()関数のフォーマット:
$ZBITFIND(expr,tvexpr[,intexpr])
式(expr)は、調べるビット文字列を指定します。
真理値式(tvexpr)は、$ZBITFIND()が(1または0)を検索するためのビット値を指定します。
オプションの整数引数[,intexpr]は、検索を開始する開始位置を指定します。この引数がない場合、$ZBITFIND() は文字列の1番目の位置から検索を開始します。$ZBIT関数は、1番目のビットをone(1)としての数えます。
もしオプションの整数引数が文字列の長さを超える場合、または、もし関数がそれ以上のビットを検出しない場合は、$ZBITFIND()はゼロの値を返します。
ビット文字列で指定された位置の値を返します。
$ZBITGET()関数のフォーマット:
$ZBITGET(expr,intexpr)
式(expr)は、調べるビット文字列を指定します。
整数引数(,intexpr)は、値を要求している文字列の位置を指定します。もし整数引数(,intexpr)が負,ゼロ,ビット文字列の長さを超える場合は、ランタイムエラーで拒否されます。$ZBIT関数は、1番目のビットをone(1)としての数えます。
ビット単位でのビット文字列の長さを返します。
$ZBITLEN()関数のフォーマット:
$ZBITLEN(expr)
式(expr)は、調べるビット文字列を指定します。
各入力ビット位置を反転するビット文字列のコピーを返します。
$ZBITNOT()関数のフォーマット:
$ZBITNOT(expr)
この式(expr)は、反転したビットパターンは関数の結果になるビット文字列をあらわします。
2つのビット文字列をビット単位で論理ORをとり、2つの引数のうち長い方の長さに等しいビット文字列を返します。(セットビットを持つ入力文字列の両方のうちのどちらか一方がこれらの位置に含んでいること)結果が得られた文字列の中で、入力文字列のどちらにも消去された1ビットが無い位置に一致している位置を置きます。
$ZBITOR()関数のフォーマット:
$ZBITOR(expr1,expr2)
最初の式(expr1)は、OR演算に入力されているビットの文字列の1つを指定します。
2番目の式(expr2)は、OR演算に入力されている他のビット文字列を指定します。
GTM>set BITSTRINGA=$zbitset($zbitset($zbitstr(8,0),2,1),8,1) ; The binary representation of A is 01000001 GTM>set BITSTRINGB=$zbitset($zbitset($zbitstr(8,0),2,1),7,1) ; The binary representation of B is 01000010 GTM>set BITSTRINGC=$zbitor(BITSTRINGA,BITSTRINGB) ; A OR B=01000011 GTM>write BITSTRINGC C GTM>
この例では、BITSTRINGBとBITSTRINGAとのビット単位の論理和(OR)の結果が表示されます。
真理値式(tvexpr)の値でセットした指定したビットで、入力ビット文字列(expr)が編集されたコピーを返します。
$ZBITSET()関数のフォーマット:
$ZBITSET(expr,intexpr,tvexpr)
式(expr)は、入力ビットの文字列を指定します。
整数型の式(intexpr)は、操作するビットの位置を指定します。負、ゼロ、または、ビット文字列の長さを超える引数は、ランタイムエラーが生じます。$ZBIT関数は、1番目のビットをone(1)としての数えます。
真理値式(tvexpr)は、指定されたビット(0または1)のどちらかをの値を指定します。
初期値としてすべてのビット位置に0または1のどちらかをセットした指定された長さのビット文字列を返します。
$ZBITSTR()関数のフォーマット:
$ZBITSTR(intexpr[,tvexpr])
整数型の式(intexpr)は、返り値としてビット文字列の長さを指定します。;最大253,952の長さを超える引数は、ランタイムエラーが生じます。
オプションの真理値式(tvexpr)には、初期値としてすべてのビット位置に0または1のどちらかにセットすべき値を指定します。この引数が省略されると、ビットはゼロに設定されます。
2つのビット文字列のビット単位の排他ORをとり、2つの引数のうち短い方の長さに等しいビット文字列を返します。(セットビットを持つ入力文字列の内、いずれかではないこれらの位置にあるビットのセットを含んでいること)結果が得られた文字列の中で、入力文字列のいずれかでもなく消去された複数ビットを持つビットのセットを持っている位置に一致している位置に置きます。
$ZBITXOR()関数のフォーマット:
$ZBITXOR(expr1,expr2)
最初の式(expr1)は、XOR演算に入力されているビットの文字列の1つを指定します。
2番目の式(expr2)は、XOR演算に入力されている他のビット文字列を指定します。
GTM>set BITSTRINGA=$zbitset($zbitset($zbitstr(8,0),2,1),8,1) ; The binary representation of A is 01000001 GTM>set BITSTRINGB=$zbitset($zbitset($zbitstr(8,0),2,1),7,1); The binary representation of B is 01000010 GTM>set BITSTRINGC=$zbitor(BITSTRINGA,BITSTRINGB) ; A XOR B=00000011 GTM>for I=1:1:8 write $zbitget(BITSTRINGC,I) 00000011 GTM>
この例では、AとBのビット単位のXORの結果を表示します。
例:
ZCRC(X) new R,I,J,B,X1,K set R=$zbitstr(8,0) for I=1:1:$length(X) Set R=$zbitxor(R,$$bitin($A(X,I))) quit $$bitout(R) bitin(X) ;CONVERT A BYTE TO A BIT STRING set X1=$zbitstr(8,0) for J=1:1:8 set B=X#2,X=X\2 if B set X1=$zbitset(X1,J,1) quit X1 bitout(X) ; CONVERT A BITSTRING TO A NUMBER set X1=0 for K=1:1:8 I $zbitget(X,K) set X1=X1+(2**(K-1)) quit X1
この例は、ビットストリームへ文字を変換すると、コード化された値を返すために、数個の$ZBIT関数を使用します。
この例は$ZBIT関数のいくつかの使用方法を示し、同時に、上記のような関数を作り出すためのコードを必要ならば、次の例では同一の結果を生じます。
ZCRC(X) new R,I,J,B,X1,K set R=$zbitstr(8,0) for I=1:1:$length(X) Set R=$zbitxor(R,$char(0)_$extract(X,I)) quit $ascii(R,2)
この例では、文字列の末尾に存在する無効ビットの数を指定する $Char() の使用を示しています。この場合には、ゼロが無効ビットです。