Page 1 sur 1

[TUTO] Lire et Ecrire un Bit dans une valeur

Publié : mer. 03/nov./2004 23:42
par Le Soldat Inconnu
Tout est expliqué dans le code. Il faut le lancer avec le debbuger pour voir le résultat de mon exemple :wink:

Code : Tout sélectionner

; 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

Publié : jeu. 04/nov./2004 3:55
par filperj
Quelques petites remarques:

Les bits se numérotent à partir de zéro.

Pour calculer un entier qui est une puissance de 2, utilise le décalage(<<) plutôt que les flottants.

Tu as mis Rset au lieu de Lset.

Je ramasse les copies dans deux heures :mrgreen:

Publié : jeu. 04/nov./2004 12:46
par nico
Comme le dit filperj utilise le décalage de bits,

La fonction WriteBin est une horreur en terme de simplicité pour la compréhension.


:?

Publié : jeu. 04/nov./2004 14:01
par Le Soldat Inconnu
oui, on peut faire également avec un décalage.
c'est vrai que pour le masque, ça doit être plus rapide. je corrige

Pour ceux que ça intéresse, j'avais calculé le masque comme ceci Pow(2, Rang)

sinon, pour Rset
Resultat$ = RSet("R", 8, "-") ; Le résultat est: "-------R"
Donc c'est bon :roll:

Publié : jeu. 04/nov./2004 16:30
par filperj
Autant pour moi, j'avais mis l'oeil droit à la place du gauche :roll:
ou l'inverse :roll:

Publié : jeu. 04/nov./2004 16:52
par Chris
Comme j'ai cru remarquer que tu étais très à cheval sur l'orthographe,
http://purebasic.hmt-forum.com/viewtopic.php?t=1799
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 :lol:

"J'obtiens", serait de bon aloi!, dit-il en mettant 10 balles dans le nourain

:roll:

Publié : jeu. 04/nov./2004 17:06
par Anonyme2
Chris a écrit : "J'obtiens", serait de bon aloi!, dit-il en mettant 10 balles dans le nourain
:roll:

Nourrain
Tiens, ça faisait longtemps; tu te rappelle de Maître Capello ?

Publié : jeu. 04/nov./2004 17:36
par Chris
Denis a écrit :
Chris a écrit : "J'obtiens", serait de bon aloi!, dit-il en mettant 10 balles dans le nourain
:roll:

Nourrain
Tiens, ça faisait longtemps; tu te rappelle de Maître Capello ?
Exact, nourrain!
Je vais dire comme à la sécu. "C'est une erreur de l'ordinateur!"

Pour maître Capello, bien sûr que je m'en souviens. :)

PS: "tu te rappelle de Maître Capello"
tu te rappelles

10 balle de plus :lol:

Publié : jeu. 04/nov./2004 17:43
par Anonyme2
Chris a écrit : PS: "tu te rappelle de Maître Capello"
tu te rappelles

10 balle de plus :lol:

J'ai toujours été faché avec la conjugaison :cry: