Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Tableaux, structures et bits

TESTB

Tester l'état de bits d'un octet

Teste si les bits désignés d'une zone d'un caractère sont tous éteints, tous allumés ou mélangés, et allume l'indicateur correspondant.

Syntaxe

     C                     TESTB'bits'    zone1      OFMXON
     C                     TESTBmasque    zone1      OFMXON
Facteur 2 (33-42)
Un littéral de numéros de bits ('0' à '7') ou une zone d'un caractère dont les bits allumés désignent les bits à tester.
Zone résultat (43-48)
La zone d'un caractère à examiner. Elle n'est pas modifiée.
Indicateurs (54-55)
Tous les bits testés sont éteints.
Indicateurs (56-57)
Mélange : certains bits allumés, d'autres éteints. Possible seulement si on teste au moins deux bits.
Indicateurs (58-59)
Tous les bits testés sont allumés.
Effet
Un seul des trois indicateurs s'allume (éteignez-les avant le test, ils gardent leur valeur sinon). La zone testée est inchangée.

À quoi ça sert

TESTB lit l'option rangée dans un octet de drapeaux : client actif ? bloqué ? imprimé ? Avec plusieurs bits, il distingue « tous », « aucun » et « certains ».

Exemple 1 : Un, deux ou plusieurs bits

     H*  TESTB : tester l'etat de bits dans une zone d'un octet
     C*  A vaut X'C1' = 11000001
     C                     MOVEL'A'       OCT     1
     C                     SETOF                     71  73
     C                     TESTB'0'       OCT        71  73
     C           *IN71     IFEQ '1'
     C           'b0 OFF'  DSPLY
     C                     END
     C           *IN73     IFEQ '1'
     C           'b0 ON'   DSPLY
     C                     END
     C                     SETOF                     71  73
     C                     TESTB'2'       OCT        71  73
     C           *IN71     IFEQ '1'
     C           'b2 OFF'  DSPLY
     C                     END
     C           *IN73     IFEQ '1'
     C           'b2 ON'   DSPLY
     C                     END
     C                     SETOF                     717273
     C                     TESTB'07'      OCT        717273
     C           *IN71     IFEQ '1'
     C           'b07 OFF' DSPLY
     C                     END
     C           *IN72     IFEQ '1'
     C           'b07 MIX' DSPLY
     C                     END
     C           *IN73     IFEQ '1'
     C           'b07 ON'  DSPLY
     C                     END
     C                     SETOF                     717273
     C                     TESTB'12'      OCT        717273
     C           *IN71     IFEQ '1'
     C           'b12 OFF' DSPLY
     C                     END
     C           *IN72     IFEQ '1'
     C           'b12 MIX' DSPLY
     C                     END
     C           *IN73     IFEQ '1'
     C           'b12 ON'  DSPLY
     C                     END
     C                     SETOF                     717273
     C                     TESTB'23'      OCT        717273
     C           *IN71     IFEQ '1'
     C           'b23 OFF' DSPLY
     C                     END
     C           *IN72     IFEQ '1'
     C           'b23 MIX' DSPLY
     C                     END
     C           *IN73     IFEQ '1'
     C           'b23 ON'  DSPLY
     C                     END
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

b0 ON
b2 OFF
b07 ON
b12 MIX
b23 OFF

A vaut X'C1' (bits 0, 1 et 7 allumés). Le bit 0 est allumé (58-59) ; le bit 2 éteint (54-55). Les bits 0 et 7 sont tous allumés. Les bits 1 et 2 sont mélangés (56-57). Les bits 2 et 3 sont tous éteints.

Exemple 2 : Octet de drapeaux d'un client

     H*  TESTB : un octet de drapeaux (bit 0 = actif, bit 3 = bloque)
     C*  Un octet vide : X'40' (blanc) n'a que le bit 1 allume
     C                     MOVEL' '       DRAP    1
     C                     BITON'0'       DRAP
     C                     TESTB'0'       DRAP           81
     C           *IN81     IFEQ '1'
     C           'Actif'   DSPLY
     C                     END
     C                     TESTB'3'       DRAP       82
     C           *IN82     IFEQ '1'
     C           'Pas bloq'DSPLY
     C                     END
     C*  On bloque le client puis on retire l'actif
     C                     BITON'3'       DRAP
     C                     BITOF'0'       DRAP
     C                     SETOF                     81  82
     C                     TESTB'0'       DRAP           81
     C                     TESTB'3'       DRAP           82
     C           *IN81     IFEQ '0'
     C           'Inactif' DSPLY
     C                     END
     C           *IN82     IFEQ '1'
     C           'Bloque'  DSPLY
     C                     END
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Actif
Pas bloq
Inactif
Bloque

Le bit 0 signifie « actif », le bit 3 « bloqué ». On allume l'actif par BITON et on constate : actif, non bloqué. On bloque et on retire l'actif : TESTB confirme « Inactif » puis « Bloque ».

Le piège

Un seul bit n'accepte pas l'indicateur « mélangé » : TESTB '0' OCT avec un indicateur en 56-57 est refusé par QRG5117, « L'indicateur résultant (positions 56 et 57) est incompatible avec l'opération TESTB portant sur moins de deux bits ». Pour un bit, codez seulement 54-55 et 58-59.

Numérotation de gauche à droite : le bit 0 est celui de gauche. Sur A (11000001), les bits 0, 1 et 7 sont allumés (premier exemple), pas les bits 0, 6 et 7.

En RPG ILE full free

En RPG ILE full free, on teste avec un ET binaire et on compare au masque : %BITAND renvoie les bits communs.

if %bitand(oct : x'80') = x'80';
  dsply 'Actif';
endif;