Opérations bit à bit sur un pointeur.
Bonjour.
Je souhaite utiliser le bit de poids faible d'un pointeur pour stocker un booléen.
J'ai mis de côté l'option bitfield et j'ai choisi de me faire quelques fonctions pour décortiquer le pointeur en adresse et en booléen.
Voici mon code.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #include <cstdio>
#include <cinttypes>
//#if (sizeof(void *) == sizeof(uint32_t))
typedef uint32_t ptr_equiv;
//#elif (sizeof(void *) == sizeof(uint64_t))
//typedef uint64_t ptr_equiv;
//#else
//#error "Unknown ptr size"
//#endif
inline void * ptrGetAddr(void * ptr)
{
return reinterpret_cast<void *>(reinterpret_cast<ptr_equiv>(ptr) & ~1U);
}
inline void * ptrSetAddr(void * ptr, void * addr)
{
return reinterpret_cast<void *>((reinterpret_cast<ptr_equiv>(addr) & ~1U) |
(reinterpret_cast<ptr_equiv>(ptr) & 1U));
}
inline bool ptrGetBool(void * ptr)
{
return reinterpret_cast<ptr_equiv>(ptr) & 1U;
}
inline void * ptrSetBool(void * ptr, bool b)
{
return reinterpret_cast<void *>((reinterpret_cast<ptr_equiv>(ptr) & ~1U) |
( b & 1U));
}
int main(int argc, char **argv)
{
void * ptr = 0;
ptr = ptrSetAddr(ptr, (void *)0xCAFEDECA);
fprintf(stdout, "%p\n", ptr);
ptr = ptrSetBool(ptr, 1);
fprintf(stdout, "%p\n", ptr);
ptr = ptrSetBool(ptr, 0);
fprintf(stdout, "%p\n", ptr);
ptr = ptrSetBool(ptr, 1);
fprintf(stdout, "%p\n", ptr);
fprintf(stdout, "%p\n", ptrGetAddr(ptr));
fprintf(stdout, "%d\n", ptrGetBool(ptr));
return 0;
} |
Mes questions sont :
- comment faire pour savoir quel est la taille de l'entier équivalent à un pointeur
- je ne suis pas sûr d'avoir trouvé la bonne solution. J'ai par exemple le sentiment qu'il y aurait un truc à faire avec les traits, ou un autre truc à côté duquel je suis passé. Pouvez-vous commenter ce code ?
Merci pour votre aide.