; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
;
; Explication du programme :
; Récupérer une valeur binaire d'une valeur Long, Word ou Byte
; Principe utilisé :
; Précision, le rang commence à 0 et pas à 1
; La procedure ReadBin applique un masque à la valeur pour savoir si le bit de rang "Position" est à 1
; Pour lire le bit de rang 1, il faut appliquer le masque %1
; Pour lire le bit de rang 2, il faut appliquer le masque %10
; etc...
; Je calcule le masque avec un décalage
; Si position = 0, j'otients %1 << 0 = %1
; Si position = 1, j'otients %1 << 1 = %10
; Si position = 2, j'otients %1 << 2 = %100
; etc...
; Ensuite j'applique ce masque à la valeur avec un opérateur & ("ET" logique)
; Si le résultat est nul, le bit de rang "Position" vaut 0, sinon, le bit de rang "Position" vaut 1
; La procedure WriteBin utilise toujours ce principe de masque
; Tout d'abord, on filtre les Bits à ne pas changer avec le masque inversé
; Pour lire le bit de rang 0, il faut appliquer le masque ~%1
; Pour lire le bit de rang 1, il faut appliquer le masque ~%10
; etc...
; On obtient donc la valeur avec le bit que l'on veut changer à 0, cela va permtre de faire simplement un "OU" pour changer la valeur du Bit à 0 ou 1
; Exemple : on a la valeur %1011, on veut changer le bit de rang 1 donc on applique le masque ~%0010 = %1101, il reste la valeur %1001
; Ensuite, on ajoute le Bit de valeur "Binaire" avec un | ("OU" logique)
; Pour mettre le bit de rang 1 à la valeur Binaire = 0 ou 1, il faut ajouter le Masque * Binaire = %0010 * Binaire = %0010 si Binaire vaut 1 et %0000 si Binaire vaut 0
; Suite de l'exemple : %1001 | (%0010 * Binaire) = %1011 si binaire vaut 1 et %1001 si binaire vaut 0
Procedure.b ReadBin(Valeur.l, Position)
If Valeur & (%1 << Position)
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.l WriteBin(Valeur.l, Position, Binaire.b)
Protected Masque.l
Masque = %1 << Position
ProcedureReturn (Valeur & ~ Masque) | (Masque * Binaire)
EndProcedure
;- Exemple
; On prend par exemple une valeur 8 bits
Byte.b = 103
; on affiche dans le debugger la valeur décimale et la valeur binaire
Debug Str(Byte ) + " [" + RSet(Bin(Byte), 8, "0") + "]"
Debug ""
; Et on lit chaque bit et on l'affiche dans le debugguer
Dim Binaire.b(7)
For n = 0 To 7
Binaire(n) = ReadBin(Byte, n)
Debug Binaire(n)
Next
Debug ""
; On recompose la valeur décimale à partir des valeurs binaires
Byte = 47 ; Je mets une valeur au hazard
For n = 0 To 7 ; Et je copie les valeur binaire dan cette valeur
Byte = WriteBin(Byte, n , Binaire(n))
Next
Debug Byte
Dernière modification par Le Soldat Inconnu le jeu. 04/nov./2004 14:02, modifié 1 fois.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu a écrit :; Si position = 0, j'otients %1 << 0 = %1
; Si position = 1, j'otients %1 << 1 = %10
; Si position = 2, j'otients %1 << 2 = %100
; etc...
Pratique le Copier/Coller!
Mais ça ne corrige pas les fautes
"J'obtiens", serait de bon aloi!, dit-il en mettant 10 balles dans le nourain