Code opération RPG III / RPG/400 · IBM i (AS/400) · Tableaux, structures et bits
BITON
Allumer des bits d'un octet
Met à 1 les bits désignés d'une zone alphanumérique de 1 caractère, sans toucher aux autres.
Syntaxe
C BITON'bits' zone1
C BITONmasque zone1
- Facteur 2 (33-42)
- Soit un littéral de numéros de bits (
'0'à'7', par exemple'07'), soit une zone d'un seul caractère : les bits allumés de ce caractère sont ceux qu'on allume dans la zone résultat. - Zone résultat (43-48)
- La zone d'un caractère dont on modifie les bits. Le bit 0 est le bit de gauche, le bit 7 celui de droite.
- Effet
- Les bits désignés de la zone résultat valent 1. Les autres bits sont inchangés. Aucun indicateur n'est positionné.
À quoi ça sert
Les programmes anciens rangent huit options (actif, bloqué, imprimé…) dans un seul octet pour économiser la place d'un enregistrement ou d'une zone de données. BITON pose une option, BITOF la retire et TESTB la relit.
Exemple 1 : Allumer des bits par numéro et par masque
H* BITON : allumer des bits ('0' = bit de gauche, '7' = bit de droite)
C* Le blanc vaut X'40' = 01000000. Bits 0 et 7 allumes : 11000001 = A
C MOVEL' ' OCT 1
C BITON'07' OCT
C OCT DSPLY
C* Facteur 2 en zone : tous les bits allumes dans MASQ sont allumes
C* dans OCT. Le A vaut 11000001, le blanc 01000000 : on retrouve A
C MOVEL'A' MASQ 1
C MOVEL' ' OCT
C BITONMASQ OCT
C OCT DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
A
A
Le blanc vaut X'40' (01000000). En allumant les bits 0 et 7, on obtient 11000001, soit X'C1' : la lettre A. Dans la seconde partie, le facteur 2 est une zone d'un caractère, MASQ, qui contient A (11000001) : ses bits allumés sont ajoutés à ceux du blanc, d'où A de nouveau.
Le piège
Les bits se comptent de gauche à droite : le bit 0 pèse 128, le bit 7 pèse 1. Le blanc (X'40') a le bit 1 allumé, pas le bit 6.
Facteur 2 en zone : un seul caractère. Une zone de 8 caractères contenant '1' ne désigne pas le bit 1 : le compilateur la refuse par QRG7050, « Facteur 2 ou zone Résultat n'est pas une zone alphanumérique à 1 caractère pour BITON, BITOF ou TESTB ». Les numéros de bits se passent en littéral.
En RPG ILE full free
En RPG ILE full free, on combine l'octet avec un masque par %BITOR. Les opérations BITON et BITOFF n'existent qu'en format fixe.
oct = %bitor(oct : x'C1');