Problème opérateurs binaires
Résolu
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 ^^
2 réponses
-
ContributeurPour 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.
#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 -
Contributeurbonjour,
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
-