[TUTO] Lire et Ecrire un Bit dans une valeur

Informations pour bien débuter en PureBasic
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

[TUTO] Lire et Ecrire un Bit dans une valeur

Message 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
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)]
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.


:?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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:
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)]
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

Autant pour moi, j'avais mis l'oeil droit à la place du gauche :roll:
ou l'inverse :roll:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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 ?
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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:
Répondre