Emballage sur le terrain pour former un seul octet

J’ai du mal à apprendre à intégrer quatre valeurs distinctes dans un seul octet. J’essaie d’obtenir une sortie hexadécimale de 0x91 et la représentation binary est supposée être 10010001 mais à la place, je reçois des sorties de: 0x1010001 et 16842753 respectivement. Ou y a-t-il une meilleure façon de faire cela?

 uint8_t globalColorTableFlag = 1; uint8_t colorResolution = 001; uint8_t sortFlag = 0; uint8_t sizeOfGlobalColorTable = 001; uint32_t packed = ((globalColorTableFlag << 24) | (colorResolution << 16) | (sortFlag << 8) | (sizeOfGlobalColorTable << 0)); NSLog(@"%d",packed); // Logs 16842753, should be: 10010001 NSLog(@"0x%02X",packed); // Logs 0x1010001, should be: 0x91 

Champ emballé

Essayez ce qui suit:

 /* packed starts at 0 */ uint8_t packed = 0; /* one bit of the flag is kept and shifted to the last position */ packed |= ((globalColorTableFlag & 0x1) << 7); /* three bits of the resolution are kept and shifted to the fifth position */ packed |= ((colorResolution & 0x7) << 4); /* one bit of the flag is kept and shifted to the fourth position */ packed |= ((sortFlag & 0x1) << 3); /* three bits are kept and left in the first position */ packed |= ((sizeOfGlobalColorTable & 0x7) << 0); 

Pour une explication de la relation entre les chiffres hexadécimaux et binarys, voir la réponse suivante: https://stackoverflow.com/a/17914633/4178025

Pour les opérations au niveau des bits, voir: https://stackoverflow.com/a/3427633/4178025

 packed = ((globalColorTableFlag & 1) << 7) + ((colorResolution & 0x7) << 4) + ((sortFlag & 1) << 3) + ((sizeOfGlobalColorTable & 0x7);