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   -
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 :

#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:

2 réponses

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 106
 
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.

#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
1
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
0
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.
0
lenouveau82 Messages postés 53 Date d'inscription   Statut Membre Dernière intervention  
 
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
0