Stocker 4 valeurs 8 bits dans un long de 32 bits

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Stocker 4 valeurs 8 bits dans un long de 32 bits

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

Dernière modification par microdevweb le jeu. 19/janv./2017 18:04, modifié 3 fois.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Mesa
Messages : 1097
Inscription : mer. 14/sept./2011 16:59

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

Message 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.
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message par microdevweb »

@Mesa,

Modifié :roll:
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message par Micoute »

Merci microdevweb pour cet excellent partage
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

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

Message 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))
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
Guillot
Messages : 529
Inscription : jeu. 25/juin/2015 16:18

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

Message 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)
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

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

Message par Fig »

Haha !! Trop fort ! :mrgreen:
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message par Kwai chang caine »

Excusez une question de teletubbies :oops:
Mais quel est l'intéret de cette combine :?:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

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

Message 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:
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

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

Message par GallyHC »

je dirais même plus cela peu permettre de stocker 4 valeurs de 8 bits dans un long de 32 bits.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

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

Message 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:
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message 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
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

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

Message par Fig »

Tu vois tu as compris... ça permet d'économiser de la mémoire.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Répondre