!--a11y-->

m 要素の集合がある場合、どんな部分集合でもビット列として表現することができます。集合の n 番目の要素が部分集合にある場合、n 番目のビットは 1 に設定されます。部分集合にない場合、このビットは 0 に設定されます。したがって、全体集合にゼロは含まれません。
ABAP では、型が X で長さが最低 m/8 の項目を使用して、m 要素の集合を表現することができます。全体集合の 1 メンバを集合に含めるには、SET BIT 命令を使用します。全体集合のどのメンバが特定集合に含まれているかをチェックするには、GET BIT 命令を使用します。以下の集合演算に対してビット演算を使用することができます。
|
集合演算 |
ビット演算 |
|
共通部分 |
BIT-AND |
|
結合 |
BIT-OR |
|
対称差 |
BIT-XOR |
特定集合が別集合の部分集合かどうかを判断するためにビット列の比較を行うとき、O 演算子を使用することもできます。

DATA: FRANKFURT(4) TYPE
X,
FRISCO(4) TYPE
X,
INTERSECT(4) TYPE X,
UNION(4) TYPE
X,
BIT TYPE
I.
DATA: CARRID TYPE
SPFLI-CARRID,
CARRIER LIKE SORTED TABLE OF CARRID
WITH
UNIQUE KEY TABLE LINE.
DATA WA TYPE SPFLI.
SELECT CARRID FROM SCARR INTO TABLE CARRIER.
SELECT CARRID CITYFROM
FROM SPFLI
INTO CORRESPONDING FIELDS OF WA.
WRITE: / WA-CARRID, WA-CITYFROM.
READ TABLE CARRIER FROM WA-CARRID TRANSPORTING NO FIELDS.
CASE WA-CITYFROM.
WHEN 'FRANKFURT'.
SET BIT SY-TABIX OF FRANKFURT.
WHEN 'SAN FRANCISCO'.
SET BIT SY-TABIX OF FRISCO.
ENDCASE.
ENDSELECT.
INTERSECT = FRANKFURT
BIT-AND FRISCO.
UNION
= FRANKFURT BIT-OR FRISCO.
SKIP.
WRITE 'Airlines flying
from Frankfurt and San Francisco:'.
DO 32
TIMES.
GET BIT SY-INDEX OF INTERSECT INTO BIT.
IF BIT = 1.
READ TABLE CARRIER INDEX SY-INDEX INTO
CARRID.
WRITE CARRID.
ENDIF.
ENDDO.
SKIP.
WRITE 'Airlines flying
from Frankfurt or San Francisco:'.
DO 32
TIMES.
GET BIT SY-INDEX OF UNION INTO BIT.
IF BIT = 1.
READ TABLE CARRIER INDEX SY-INDEX INTO
CARRID.
WRITE CARRID.
ENDIF.
ENDDO.
これにより、出力一覧が以下のように生成されます。

このプログラムでは、FRANKFURT 、FRISCO 、INTERSECT 、および UNION という、長さが 4 の 4 つの 16 進項目を使用します。これらの各項目で、最大 32 要素の集合を表現することができます。基本集合は、データベーステーブルSCARR からの全航空会社の集合です。対応するビット列の各ビットが、1 つの航空会社を表します。索引を準備するために、外部索引テーブルCARRIER を作成し、そこにテーブルSCARR の航空会社コードを入力します。これにより、テーブルCARRIER の内部索引を使用して、航空会社の特定が可能になります。
データベーステーブル SPFLI の SELECT ループでは、出発地の都市にしたがい、項目FRANKFURT またはFRISCO で、航空会社に対応するビットが設定されます。行番号SY-TABIX がREAD 命令によって設定されます。この命令で項目は転送されません。
FRANKFURT と FRISCO の共通部分または結合が、ビット演算 BIT-AND および BIT-OR によって作成されます。
INTERSECT および UNION の各ビットは、 2 つの DO ループ内で 1 ビットずつ読み込まれて評価されます。項目内で値が 1 である桁ごとに、READ 命令によってテーブル CARRIER から航空会社コードが読み出されます。
