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;