Aller au contenu

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');