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