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 :

#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

  1. Contributeur
    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. 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
  2. Contributeur
    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.
    1. 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