ビットの操作

COBOL 環境でのプログラミングでは、文字、フィールド、レコード、およびファイルで構成されたデータを処理しますが、個々のデータ ビットの処理が必要になる場合もあります。たとえば、ビット操作は、次のような処理を行うアプリケーションで重要な機能です。


  • 画面およびグラフィックスのインターフェイス
  • 暗号化技術
  • システムレベルのルーチン
  • テーブルルックアップ、つまり着信コードを拡張値へ変換
  • データの圧縮と解凍

論理ルーチンによるビットの操作

ビット操作で使用する次のようなルーチンが含まれたライブラリ ルーチン セットがあります。

CBL_NOT 論理否定
CBL_AND 論理積
CBL_ OR 論理和
CBL_EQ 論理等価
CBL_ XOR 排他的論理和
CBL_IMP 論理包含

これらの論理演算の演算結果を次の真偽表に示します。

A

B

  0

0 

0

1

1

0 

1

1

CBL_NOT (A の論理否定) 1 1 0 0
CBL_AND (A と B の論理積) 0 0 0 1
CBL_ OR (A と B の論理和) 0 1 1 1
CBL_EQ (A と B の論理等価) 1 0 0 1
CBL_ XOR (A と B の排他的論理和) 0 1 1 0
CBL_IMO (A と B の論理包含) 1 1 0 1

たとえば、CBL_EQ ルーチンがビット A と B を比較する際に、A と B の両方が 0 の場合、または A と B の両方が 1 の場合は、ビットが 1 に設定されます。そうでない場合は、ビットが 0 に設定されます。

ブール型データ項目としてのビットの操作

データ項目を PICTURE 文字列 1 を使用して ブール として定義することもできます(「PICTURE 句」のトピックを参照)。ブール演算子の B-AND、B-OR、B-XOR、および B-NOT を使用して、それぞれ "and"、"or"、"exclusive or"、および "negate" 演算を実行します。これらの演算子は、次の例のようにブール式で使用します。

 01 My-flag PIC 1111 USAGE BIT VALUE B"0000".
01 My-flag-2 PIC 1111 USAGE BIT.
...
MOVE B"0011" to My-flag-2 *> Initialize My-flag-2
...
COMPUTE My-flag = B-NOT My-flag-2 *> set the bits in My-flag to the
*> reverse of My-flag-2, 1100.
...
COMPUTE My-flag = My-flag B-AND B"0000" *> turn off all the bits in My-flag.
...
COMPUTE My-flag-2 = My-flag-2 B-OR B"1000" *> set bit 1 ON in My-flag-2, keeping
*> other bits unchanged.

ブール項目は、次の 2 つの方法でテストできます。


  • 次の例のように、項目の長さが 1 ビットと 1 文字のどちらかを判定するブール条件を使用する
    01 Single-bit-item pic 1 usage bit.
    01 Multiple-bit-item pic 1(7) usage bit.
    ...
    IF Single-bit-item THEN CALL a-program *> calls if Single-bit-item is true (1)
    
  • 次の例のように、等しいか等しくないかを判定する関係条件を使用する
    IF My-flag-2 EQUAL B"1000" THEN CALL a-program

ブール型データ項目を整数に変換する

次の例のように、ブール項目は組み込み関数の INTEGER-OF-BOOLEAN を使用して整数に変換でき、整数項目は組み込み関数の BOOLEAN-OF-INTEGER を使用してブール型に変換できます。

01 bit-item PIC 1(6) usage BIT.

01 integer-item PIC 9(5) VALUE 544. *>  1000100000 in binary
01 integer-item-2 PIC 9(3).
...
MOVE FUNCTION BOOLEAN-OF-INTEGER ( integer-item , 6) TO bit-item.
*> the function returns the low order 6 bits of the binary representation of the
*> integer value, and MOVE stores it in bit-item, padding on the right with 0’s
...
COMPUTE integer-item-2 = FUNCTION INTEGER-OF-BOOLEAN (bit-item).
*> the function returns the numeric value of the leading 6 bits (100000 in binary), 32, and
*> COMPUTE puts 032 in integer-item-2