Problème opérateurs binaires
Résolu
lenouveau82
Messages postés
53
Date d'inscription
Statut
Membre
Dernière intervention
-
lenouveau82 Messages postés 53 Date d'inscription Statut Membre Dernière intervention -
lenouveau82 Messages postés 53 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous, je me tourne vers vous pour savoir si l'un de vous saurait m'aider à comprendre le fonctionnement d'un bout de code, mais surtout ce qu'il fait dans la mémoire vive :
Voilà une ligne qui permet de concaténer quatre valeurs destinées à paramétrer l'affichage des couleurs de formes avec la SDL.
Et voilà des définitions dans un autre fichier qui sont censés récupérer la valeur concaténer et la re-séparer en plusieurs pour qu'elle soit utilisable. Le problème est que je n'arrive pas à comprendre la logique derrière ces lignes et surtout ce qu'il se passe au niveau de la mémoire. Si quelqu'un voulait bien m'aider ce serait chique de sa part ^^
#define mRGBA (((uint32_t)a<<24)|((uint32_t)b<<16)|((uint32_t)g<<8)|((uint32_t)r<<0))
Voilà une ligne qui permet de concaténer quatre valeurs destinées à paramétrer l'affichage des couleurs de formes avec la SDL.
#define mRGBA_r(RGBA) ((Uint8)RGBA) #define mRGBA_g(RGBA) ((Uint8)(RGBA>>8)) #define mRGBA_b(RGBA) ((Uint8)(RGBA>>16)) #define mRGBA_a(RGBA) ((Uint8)(RGBA>>24))
Et voilà des définitions dans un autre fichier qui sont censés récupérer la valeur concaténer et la re-séparer en plusieurs pour qu'elle soit utilisable. Le problème est que je n'arrive pas à comprendre la logique derrière ces lignes et surtout ce qu'il se passe au niveau de la mémoire. Si quelqu'un voulait bien m'aider ce serait chique de sa part ^^
A voir également:
- Les données de chaîne ou binaires seront tronquées.
- Fuite données maif - Guide
- Supprimer les données de navigation - Guide
- Chaine tnt gratuite sur mobile - Guide
- Plus de chaine tv - Guide
- Chaine radio - Télécharger - Médias et Actualité
2 réponses
Pour la première macro, l'opérateur << fait un décalage vers la gauche des bits contenus dans les variables a, b, g et r dont les valeurs sont combinées avec un ou logique dans quelque chose qui devrait avoir un type uint32_t, la valeur de a étant décalée de 24 bits, celle de b de 16 bits, celle de g de 8 et celle de r restant comme elle est.
Le résultat est stocké en mémoire dans l'ordre : a b g r.
donne :
Cela fonctionne sous réserve que a, b, g, r soient des int8_t (ou un type supérieur à condition que les bits 0 à 7 soient les seuls à contenir des 1).
Les autres macro font des décalages vers la droite d'un uint32_t et utilisent un transtypage sur un byte pour obtenir le dernier byte (formé des bits se retrouvant alors en positions 0 à 7). Cela permet d'extraire les composantes souhaitées selon le nombre de bits décalés.
Dal
Le résultat est stocké en mémoire dans l'ordre : a b g r.
#include <stdio.h> #include <stdint.h> #include <inttypes.h> #define mRGBA (((uint32_t)a<<24)|((uint32_t)b<<16)|((uint32_t)g<<8)|((uint32_t)r<<0)) int main(void) { int8_t a = 0xf; int8_t b = 0x33; int8_t g = 0x22; int8_t r = 0x11; uint32_t my_RGBA = mRGBA; printf("my_RGBA = %08"PRIx32"\n", my_RGBA); return 0; }
donne :
my_RGBA = 0f332211
Cela fonctionne sous réserve que a, b, g, r soient des int8_t (ou un type supérieur à condition que les bits 0 à 7 soient les seuls à contenir des 1).
Les autres macro font des décalages vers la droite d'un uint32_t et utilisent un transtypage sur un byte pour obtenir le dernier byte (formé des bits se retrouvant alors en positions 0 à 7). Cela permet d'extraire les composantes souhaitées selon le nombre de bits décalés.
Dal
lenouveau82
Messages postés
53
Date d'inscription
Statut
Membre
Dernière intervention
Haaaaa ! Super merci je viens de tout comprendre. Ben super, c'est beaucoup plus clair. Je marque le sujet comme résolu dans ce cas, merci beaucoup
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour,
je peux deviner ce que cela fait.
pour en être certain, il faudrait voir comment c'est utilisé.
montre nous un exemple de programme.
Le premier pourrait être utilisé pour assigner à une variable de 32 bits la concaténation de 4 octets.
Le second pourrait être utilisé pour extraire chacun des 4 octets d'une variable de 32 bits.
je peux deviner ce que cela fait.
pour en être certain, il faudrait voir comment c'est utilisé.
montre nous un exemple de programme.
Le premier pourrait être utilisé pour assigner à une variable de 32 bits la concaténation de 4 octets.
Le second pourrait être utilisé pour extraire chacun des 4 octets d'une variable de 32 bits.
Merci de ta réponse, oui c'est ce que ça fait (à ceci près que le premier s'utilise directement avec la macro, il n'est pas nécessaire d'assigner la valeur à une variable) mais j'aurais voulu savoir ce qu'il se passe précisément au niveau binaire. Comment les 32 bits s'agencent ? Que font précisément les symboles << et >> ? Comment le deuxième fait pour extraire les valeurs de la variable concaténée ? En fait j'ai du mal à me représenter ce qu'il se passe en mémoire