Problème opérateurs binaires

Résolu/Fermé
lenouveau82 Messages postés 53 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 30 juillet 2024 - 28 avril 2022 à 11:42
lenouveau82 Messages postés 53 Date d'inscription mercredi 7 décembre 2016 Statut Membre Dernière intervention 30 juillet 2024 - 28 avril 2022 à 14:58
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

[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 28 avril 2022 à 14:55
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 mercredi 7 décembre 2016 Statut Membre Dernière intervention 30 juillet 2024
28 avril 2022 à 14:58
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 23337 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 novembre 2024 Ambassadeur 1 551
Modifié le 28 avril 2022 à 14:06
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 mercredi 7 décembre 2016 Statut Membre Dernière intervention 30 juillet 2024
28 avril 2022 à 14:23
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