Aller au contenu

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

BITOF

Éteindre des bits d'un octet

Met à 0 les bits désignés d'une zone alphanumérique de 1 caractère, sans toucher aux autres.

Syntaxe

     C                     BITOF'bits'    zone1
     C                     BITOFmasque    zone1
Facteur 2 (33-42)
Un littéral de numéros de bits ('0' à '7', par exemple '017'), ou une zone d'un seul caractère dont les bits allumés désignent les bits à éteindre.
Zone résultat (43-48)
La zone d'un caractère dont on éteint les bits. Le bit 0 est le bit de gauche.
Effet
Les bits désignés de la zone résultat valent 0. Les autres bits sont inchangés. Aucun indicateur n'est positionné.

À quoi ça sert

BITOF est le complément de BITON : il retire une option d'un octet de drapeaux (débloquer un client, annuler un marquage) sans modifier les autres options.

Exemple 1 : Éteindre des bits par numéro et par masque

     H*  BITOF : eteindre des bits d'une zone d'un octet
     C*  A vaut X'C1' = 11000001. Bit 1 eteint : 10000001 = a
     C                     MOVEL'A'       OCT     1
     C                     BITOF'1'       OCT
     C           OCT       DSPLY
     C*  Zone masque : a vaut 10000001, ses bits 0 et 7 sont eteints dans OCT
     C*  A = 11000001 devient 01000000 = blanc
     C                     MOVEL'A'       OCT
     C                     MOVEL'a'       MASQ    1
     C                     BITOFMASQ      OCT
     C           OCT       COMP ' '                      81
     C           *IN81     IFEQ '1'
     C           'Blanc'   DSPLY
     C                     END
     C                     SETON                     LR

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

a
Blanc

A vaut X'C1' (11000001). Éteindre le bit 1 donne 10000001, soit X'81' : la lettre a. Dans la seconde partie, la zone MASQ contient a (10000001) : les bits 0 et 7 de A sont éteints, il reste 01000000, un blanc.

Le piège

Les bits se comptent de gauche à droite : éteindre le bit 1 de A donne a, éteindre le bit 7 donnerait X'C0'. Ce n'est pas une inversion : un bit déjà éteint reste éteint.

Le facteur 2 en zone ne contient qu'un caractère : sinon QRG7050, « Facteur 2 ou zone Résultat n'est pas une zone alphanumérique à 1 caractère pour BITON, BITOF ou TESTB ».

En RPG ILE full free

En RPG ILE full free, on retire des bits par un ET avec le complément du masque : %BITAND et %BITNOT.

oct = %bitand(oct : %bitnot(x'40'));