Fonctions de manipulation des bits

new art 14


Les procédures d'accès au bit manipulent les représentations internes indépendamment des valeurs externes correspondant.
Tous les arguments de ces fonctions sont de type entier (quelconque).
Les bits sont numérotés "à partir de la droite", c'est-à-dire en partant des "bits de poids le plus faibles", le bit le plus à droite portant le numéro 0.



Les opérations logiques bit à bit


iand (i, j)

"et" binaire catégorie: D arguments: i,i résultat: i

Renvoie l'entier obtenu en effectuant une opération "et" sur chacun des bits de même rang de i et j (1 et 1 donne 1, toutes les autres combinaisons donnent 0). Le résultat est un entier de même variante que i et j (les deux arguments doivent être entiers de même variante).


ior (i, j)

"ou inclusif" binaire catégorie: D arguments: i,i résultat: i

Renvoie l'entier obtenu en effectuant une opération "ou" inclusif sur chacun des bits de même rang de i et j (0 et 0 donne 0, toutes leurs autres combinaisons donnent 1). Le résultat est un entier de même variante que i et j, qui doivent être, tous deux, de même variante.


ieor (i, j)

"ou exclusif" binaire catégorie: D arguments: i,i résultat: i

Renvoie l'entier obtenu en effectuant une opération "ou" exclusif sur chacun des bits de même rang de i et j (1 et 1 donne 0, 1 et 0 ou 0 et 1 donnent 1, 0 et 0 donne 0). Le résultat est un entier de même variante que i et j, qui doivent être, tous deux, de même variante.


not (i)

"négation" binaire catégorie: D arguments: i résultat: i

Renvoie l'entier correspondant à la négation des bits de i, obtenu en "complémentant" à un chacun des bits du motif binaire de i (1 devient 0 et 0 devient 1). Le résultat entier est de la même variante que i.


Exemples:

1 est représenté en binaire comme 00...001
3 est représenté en binaire comme 00...011
iand(1,3) vaut 1
ior(1,3) vaut 3
ieor(1,3) vaut 2
not(-2) vaut 1 (du à la technique de codage de complément à deux)
not(-1) vaut 0
not(0) vaut -1
not(1) vaut -2



Fonctions de decalage


ishft (i, shift)

décalage avec expulsion catégorie: D arguments: i,i résultat: i

Renvoie l'entier obtenu en décalant de shift (entier quelconque) bits vers la gauche (ou de shift bits vers la droite si shift<0) le motif binaire correspondant à la valeur de i. Les shift bits perdus de gauche (ou shift bits perdus de droite si shift<0 ) sont compensés par des 0. Le résultat (de type entier) a la même variante que i. Si shift=0, le résultat est égal à l'argumenti.


ishftc (i, shift [, size])

décalage circulaire catégorie: D arguments: i,i[,i] résultat: i

Renvoie l'entier obtenu en décalant "circulairement" de shift (entier quelconque) bits vers la gauche (ou de shift bits vers la droite si shift<0) l'ensemble de size (entier quelconque) bits les plus à droite (ou tous les bits si le paramètre size est omis) du motif binaire de i. Le résultat (de type entier) a la même variante que i.


Exemples:

3 est représenté en binaire comme 00...0011
ishft(3,1) vaut 6 car en binaire 00...0110 vaut 6
3 est représenté en binaire comme 00...0|011
(la barre verticale marque la limite du décalage)
ishftc(3,2,3) vaut 5 car en binaire 00...0 |101 vaut 5
(le décalage circulaire de 2 bits sur 011 fourni 101)



Procedures d'access au bit


btest (i, pos)

valeur d'un bit catégorie: D arguments: i,i résultat: l

Renvoie la valeur logique du bit pos dans i. La valeur est vrai si le bit de rang pos (entier quelconque positif) de la valeur de i (entier quelconque) est à un et la valeur faux dans le cas contraire.


ibclr (i, pos)

forçage d'un bit à 0 catégorie: D arguments: i,i résultat: i

Renvoie l'entier obtenu en forçant à 0 le bit de rang pos (entier quelconque positif) dans la valeur i. Le résultat est de type entier et de la même variante que i.


ibset (i, pos)

forçage d'un bit à 1 catégorie: D arguments: i,i résultat: i

Renvoie l'entier obtenu en forçant à 1 le bit de rang pos (entier quelconque positif) dans la valeur i. Le résultat est de type entier et de la même variante que i.


ibits (i, pos, len)

extraction d'une suite de bits catégorie: D arguments: i,i,i résultat: i

Renvoie l'entier correspondant à la chaîne de len bits extraite de i à partir du bit pos à gauche (entier quelconque positif ). La chaîne len est complétée à gauche par des 0. Le résultat est entier de la même variante quei.


Exemples:

btest((/3,4/),2) vaut (/.false.,.true./) car 3 est représenté en binaire comme 00...0011
et 4 est représenté en binaire comme 00...0100
ibclr(31,pos=(/1,2,3,4/)) vaut (/29,27,23,15 /) car 31 est représenté en binaire comme 00...011111
ibset(0,pos=(/1,2,3,4/)) vaut (/2,4,8,16 /) car 0 est représenté en binaire comme 00...0
ibits(14,1,3) vaut7 car 14 est représenté en binaire comme 00...01110 (les bits extraits sont soulignes)



Le sous-programme élémentaire: mvbits


call mvbits (from, frompos, len, to, topos)

copie des bits catégorie: D arguments: i,i,i,i résultat: i

paramètres d'entrée: from, frompos, len,topos
paramètres - résultats: to

Copie len bits de from, à partir de celui de rang frompos (à gauche) dans to, à partir du bit de rang topos (inclus , à gauche) , sans modifier la valeur des autres bits. Il faut que topos+len<=bit_size(to). Les arguments frompos, len et topos sont des entiers quelconques, from et to sont des entiers de même variante. L'argument to est un paramètre de genre intent(out) et doit obligatoirement être une "variable". Il est possible que from et to soient identiques.


Exemples:

par exemple pour n=to=6=00...00110
call mvbits(7,2,2,n,0) donne à n la valeur 5 car
from=7=00...00111,

n=to=6=00...00110 ,
10 dans n est remplacé par 01 en provenance de from ce qui donne le résultat
n=00...00101=5


Retour à la table des matières