Mengenoperationen mit Bitfolgen 

Ausgehend von einer Grundmenge von m Elementen, läßt sich jede Teilmenge der Grundmenge als Bitfolge von m Bits darstellen. Wenn das n-te Element der Grundmenge in einer Teilmenge vorhanden ist, wird das Bit an der Stelle n auf Eins ansonsten auf Null gesetzt. Die Grundmenge selbst enthält also nur Einsen.

In ABAP kann man eine Menge von m Elementen durch ein Feld des Datentyps X darstellen, dessen Länge mindestens m/8 sein muß. Mit der Anweisung SET BIT kann man ein Element der Grundmenge in die Menge aufnehmen. Mit der Anweisung GET BIT kann man überprüfen, welche Elemente der Grundmenge in der Menge enthalten sind. Folgende Mengenoperationen lassen sich durch Bitoperationen durchführen:

Mengenoperation

Bitoperation

Durchschnitt

BIT-AND

Vereinigung

BIT-OR

Symmetrische Differenz

BIT-XOR

Mit dem Operator O beim Vergleich zwischen Bitfolgen läßt sich weiterhin feststellen, ob eine Menge Obermenge einer anderen Menge ist.

REPORT demo_data_bit.

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.

 

Die Ausgabeliste sieht z.B. so aus:

Das Programm arbeitet mit vier Hexadezimalfeldern der Länge 4, nämlich FRANKFURT, FRISCO, INTERSECT und UNION. Diese Felder können Mengen mit maximal 32 Elementen darstellen. Die Grundmenge soll hier die Menge aller möglichen Fluggesellschaften aus der Datenbanktabelle SCARR sein. Jedes Bit der entsprechenden Bitfolgen soll eine Fluggesellschaft repräsentieren. Zur Indizierung der Fluggesellschaften wird die interne Indextabelle CARRIER angelegt und mit den Kürzeln der Fluggesellschaften aus SCARR gefüllt. Die Identifizierung einer Fluggesellschaft erfolgt über den internen Index der Tabelle CARRIER.

In der SELECT-Schleife über die Datenbanktabelle SPFLI wird je nach Abflugort entweder im Feld FRANKFURT oder FRISCO das Bit an der Position gesetzt, daß der Zeilennummer der Fluggesellschaft in der Tabelle CARRIER entspricht. Die Zeilennummer SY-TABIX wird hierzu mit einer READ-Anweisung, bei der keine sonstigen Felder transportiert werden, festgestellt.

Durch die Bitoperationen BIT-AND und BIT-OR werden Schnitt- und Vereinigungsmenge aus FRANKFURT und FRISCO gebildet.

In zwei DO-Schleifen werden die Bits von INTERSECT und UNION einzeln gelesen und ausgewertet. Dabei werden zu jeder gesetzten Position die Kürzel der Fluggesellschaften mit einer READ-Anweisung aus der Tabelle CARRIER geholt.