ビットの操作

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

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

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

ビット操作を行うためのライブラリ ルーチン セットがあります。これらのライブラリ ルーチンは次のとおりです。

CBL_NOT 論理否定
CBL_AND 論理積
CBL_OR 論理和
CBL_EQ 論理等価
CBL_XOR 排他的論理和
CBL_IMP 論理包含

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

A   0 0 1 1
CBL_NOT (A の論理否定) 1 1 0 0
A   0 0 1 1
B   0 1 0 1
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_IMP (A と B の論理包含) 1 1 0 1

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

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

PICTURE 文字 1 を使用してデータ項目をブール値として定義し、ブール演算子 B-AND、B-OR、B-XOR、および B-NOT を使用して「論理積」、「論理和」、「排他的論理和」、および「否定」演算を実行することもできます。これらの演算子はブール式で使用されます。次に例を示します。

 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