Page 1 sur 2

Stocker 4 valeurs 8 bits dans un long de 32 bits

Publié : jeu. 19/janv./2017 17:00
par microdevweb
Juste pour le fun, voici une procédure qui vous permet de stocker 4 valeurs 8 bits (de 0 à 255) dans un entier long de 32 bits.

Code : Tout sélectionner

maValeur=SetBit(bitRange3.c,bitRange2.c,bitRange1.c,bitRange0.c)
On renseigne les 4 valeurs en partant des bits de poids ford vers les bits de poids faible

La deuxième procédure permet de lire une des 4 valeurs

Code : Tout sélectionner

GetBitRangeValues(Values.l,Range)
--> Values la variable ou sont stockées les valeurs, le rand de 0 à 3

Code : Tout sélectionner

EnableExplicit
Global V.l
Procedure.l SetBit(bitRange3.a,bitRange2.a,bitRange1.a,bitRange0.a)
  Protected Values.a,N,ValReturn.l=0,tmp.a
  If bitRange3>255 Or bitRange3<0
    MessageRequester("Error","Bit Range is unavailable")
    ProcedureReturn
  EndIf
  If bitRange2>255 Or bitRange3<0
    MessageRequester("Error","Bit Range is unavailable")
    ProcedureReturn
  EndIf
  If bitRange1>255 Or bitRange3<0
    MessageRequester("Error","Bit Range is unavailable")
    ProcedureReturn
  EndIf
  If bitRange0>255 Or bitRange3<0
    MessageRequester("Error","Bit Range is unavailable")
    ProcedureReturn
  EndIf
  ; Set bits Range 3
  N=7
  Values=bitRange3
  While Values>0
    tmp=Pow(2,N)
    If(Values-tmp>=0)
      Values-tmp
      ValReturn=ValReturn|tmp<<24
    EndIf
    N-1
  Wend  
  ; Set bits Range 2
  N=7
  Values=bitRange2
  While Values>0
    tmp=Pow(2,N)
    If(Values-tmp>=0)
      Values-tmp
      ValReturn=ValReturn|tmp<<16
    EndIf
    N-1
  Wend  
  ; Set bits Range 1
  N=7
  Values=bitRange1
  While Values>0
    tmp=Pow(2,N)
    If(Values-tmp>=0)
      Values-tmp
      ValReturn=ValReturn|tmp<<8
    EndIf
    N-1
  Wend  
  ; Set bits Range 0
  N=7
  Values=bitRange0
  While Values>0
    tmp=Pow(2,N)
    If(Values-tmp>=0)
      Values-tmp
      ValReturn=ValReturn|tmp
    EndIf
    N-1
  Wend  
  ProcedureReturn ValReturn
EndProcedure
Procedure GetBitRangeValues(Values.l,Range)
  Protected ValReturn.l
  If(Range<0 Or Range>3)
   
  EndIf
  Select Range
    Case  0
      ValReturn=Values&$000000FF
    Case  1
      ValReturn=Values&$0000FF00
      ValReturn=ValReturn>>8
    Case  2
      ValReturn=Values&$00FF0000
      ValReturn=ValReturn>>16
    Case  3
      ValReturn=Values&$FF000000
      ValReturn=ValReturn>>24
      ValReturn=ValReturn&$000000FF
    Default
       MessageRequester("Error","The Range is unavailable")
   EndSelect
   ProcedureReturn ValReturn
EndProcedure
v=SetBit(247,164,43,31)
Debug RSet(Bin(V,#PB_Long),32,"0")
Debug "Values of Range 0 : "+Str(GetBitRangeValues(V,0))
Debug "Values of Range 1 : "+Str(GetBitRangeValues(V,1))
Debug "Values of Range 2 : "+Str(GetBitRangeValues(V,2))
Debug "Values of Range 3 : "+Str(GetBitRangeValues(V,3))


Re: Socker 4 valeurs 8 bites dans un long de 32 bites

Publié : jeu. 19/janv./2017 17:51
par Mesa
Pour plus de sûreté, il faudrait remplacer les .c par .a à cause de l'unicode.

Extrait de l'aide:
Types basiques
PureBasic permet de définir des variables de plusieurs types comme les entiers, des nombres à virgule, des caractères (char) et des chaînes de caractères aussi.
Voici la liste des types natifs supportés:

Nom Extension Encombrement en mémoire Plage
Byte .b 1 octet -128 à +127
Ascii .a 1 octet 0 à +255
Caractère .c 1 octet (en mode ascii et seulement avec les compilateurs 5.4x et antérieurs) 0 à +255
Caractère .c 2 octets (unicode) 0 à +65535

Et merci de ne pas confondre la "bite" avec le "bit" :D :D :D

M.

Re: Socker 4 valeurs 8 bits dans un long de 32 bits

Publié : jeu. 19/janv./2017 18:05
par microdevweb
@Mesa,

Modifié :roll:

Re: Socker 4 valeurs 8 bits dans un long de 32 bits

Publié : ven. 20/janv./2017 10:09
par Micoute
Merci microdevweb pour cet excellent partage

Re: Stocker 4 valeurs 8 bits dans un long de 32 bits

Publié : dim. 22/janv./2017 21:39
par Fig
Merci pour ce partage. Une version identique, plus courte, mais moins compréhensible pour cette section tutoriel à l'intention des débutants.
J'utilise la propriété du type .a de tronquer les nombres supérieurs à 255 ou négatifs. Il renvoie donc les 8 bits de poids les plus faibles ce qui évite bien des tests et des masques binaires.

Code : Tout sélectionner

EnableExplicit
Global V.l
Procedure.l SetBit(bitRange3.a,bitRange2.a,bitRange1.a,bitRange0.a)
  ProcedureReturn bitrange3<<24|bitrange2<<16|bitrange1<<8|bitrange0
EndProcedure
Procedure.a GetBitRangeValues(Values.l,Range.a)
      If range>3:MessageRequester("Error","The Range is unavailable"):ProcedureReturn:EndIf
      ProcedureReturn Values>>(Range<<3)
EndProcedure
v=SetBit(20,164,43,31)
Debug RSet(Bin(V,#PB_Long),32,"0")
Debug "Values of Range 0 : "+Str(GetBitRangeValues(V,0))
Debug "Values of Range 1 : "+Str(GetBitRangeValues(V,1))
Debug "Values of Range 2 : "+Str(GetBitRangeValues(V,2))
Debug "Values of Range 3 : "+Str(GetBitRangeValues(V,3))

Re: Stocker 4 valeurs 8 bits dans un long de 32 bits

Publié : lun. 23/janv./2017 9:57
par Guillot
encore plus court :
:mrgreen:

Code : Tout sélectionner

v=RGBA(31,43,164,20)
Debug v
Debug Red(v)
Debug Green(v)
Debug Blue(v)
Debug Alpha(v)

Re: Stocker 4 valeurs 8 bits dans un long de 32 bits

Publié : lun. 23/janv./2017 10:39
par Fig
Haha !! Trop fort ! :mrgreen:

Re: Stocker 4 valeurs 8 bits dans un long de 32 bits

Publié : lun. 23/janv./2017 12:52
par microdevweb
@Guillot bien vu avec RGBA :wink:.

Nb: Le code peut être modifié pour stocké deux valeur de 16 bits dans les 32 bits dispo

Re: Stocker 4 valeurs 8 bits dans un long de 32 bits

Publié : lun. 23/janv./2017 15:13
par Kwai chang caine
Excusez une question de teletubbies :oops:
Mais quel est l'intéret de cette combine :?:

Re: Stocker 4 valeurs 8 bits dans un long de 32 bits

Publié : lun. 23/janv./2017 19:01
par JohnJohnsonSHERMAN
L'intérêt est de stocker 4 valeurs de 8 bits dans un long de 32 bits. Cela peut par exemple te permettre de stocker 4 valeurs de 8 bits dans un long de 32 bits, voire même de stocker 4 valeurs de 8 bits dans un long de 32 bits. :mrgreen: :mrgreen:

Re: Stocker 4 valeurs 8 bits dans un long de 32 bits

Publié : lun. 23/janv./2017 19:36
par GallyHC
je dirais même plus cela peu permettre de stocker 4 valeurs de 8 bits dans un long de 32 bits.

Re: Stocker 4 valeurs 8 bits dans un long de 32 bits

Publié : lun. 23/janv./2017 20:49
par JohnJohnsonSHERMAN
Merci de cette idée Gally, je n'aurais jamais pensé à utiliser cela comme ça !! :P Ca va changer ma vie de tous les jours. :mrgreen:

Re: Stocker 4 valeurs 8 bits dans un long de 32 bits

Publié : mar. 24/janv./2017 13:29
par microdevweb
Et oui ca sert à quoi ?

Exemple une couleur rgba est stockée de cette manière, red(0 à 255),green(0 à 255),blue(0 à 255),alpha(0 à 255).

En utilisant cette principe on peut donc passer 4 valeurs ou modifier 4 valeurs (0 à 255) en ne passant q'une seul variable.

On peut par exemple utilisé cela pour la clé d'une table de hachage (map), 4 clés résumées en 1 valeur.

Je sais pertinemment que cela n'a que peux d'intérêt dans beaucoup de cas, mais cette technologie est largement utilisée dans le codage de certains fichiers tel-que les fichiers Midi.

Cet exemple n'étant qu'une manière de montrer la manipulation de bits.

Si il est vrai maintenant que dans le cas d'un Pc on ne manque pas de mémoire, et que les développeurs ne se soucies plus d’économiser les bits ce n'était pas le cas il n'y pas si longtemps de ça et c'est toujours le cas pour les microcontroleurs.

Ex: En 1996 l'auto-destruction de Ariane 5 du à une seule petite variable de 8 bits (0 à 255) largement suffisent pour Ariane 4 avec une accélération verticale de de +- 64 alors que sa petite sœur plus véloce pouvait atteindre 300 d'ou un dépassement de capacité et quand il y à dépassement de capacité la variable passe en négatif et dans ce cas boommmmmmm.

Résultat: 370 millions de dollars en fumée et poussières :cry:

https://youtu.be/kYUrqdUyEpI
https://fr.wikipedia.org/wiki/Vol_501_d'Ariane_5

Re: Stocker 4 valeurs 8 bits dans un long de 32 bits

Publié : mar. 24/janv./2017 13:48
par Kwai chang caine
JohnJohnsonSHERMAN a écrit :L'intérêt est de stocker 4 valeurs de 8 bits dans un long de 32 bits. Cela peut par exemple te permettre de stocker 4 valeurs de 8 bits dans un long de 32 bits, voire même de stocker 4 valeurs de 8 bits dans un long de 32 bits. :mrgreen: :mrgreen:
Aaaaaah bon !!!!! j'avais tout faux... quel benet, vous allez rire.... d'ailleurs j'en ris encore moi-même :lol:

Moi.... j'avais compris qu'avec ce code on pouvait "stocker 4 valeurs de 8 bits dans un long de 32 bits" pfffffff :roll:
Des fois....je sais pas ce qui me passe par la tête :oops:
microdevweb a écrit :Et oui ca sert à quoi ?
Merci de ton explication 8)
Certe "un peu moins" précise que celle de SHERMAN :wink:
Mais en fait, c'est comme une variable structurée alors, avec une seule variable on passe plusieurs valeurs :D

Re: Stocker 4 valeurs 8 bits dans un long de 32 bits

Publié : mer. 25/janv./2017 10:27
par Fig
Tu vois tu as compris... ça permet d'économiser de la mémoire.