Bonjour,
Je suis tombé sur ce bout de code et je ne comprend pas ce que signifie leCode::5
A quoi est-ce que ça sert ?Code:
1
2
3
4
5
6
7 struct Color565 { uint16 B:5; uint16 G:6; uint16 R:5; };
Version imprimable
Bonjour,
Je suis tombé sur ce bout de code et je ne comprend pas ce que signifie leCode::5
A quoi est-ce que ça sert ?Code:
1
2
3
4
5
6
7 struct Color565 { uint16 B:5; uint16 G:6; uint16 R:5; };
Bonjour,
Il s'agit d'un bitfield : voir ce cours C++ de Développez, ou pour plus d'info ce cours C.
Dans ton cas, ça permet de définir un format de couleur dans lequel le bleu et le rouge ne sont codés que sur 5 bits, alors que le vert est codé sur 6 bits. La couleur est donc codée au total sur 16 bits, soit seulement 2 octets. Sans les bitfields, tu ne pourrais avoir que des canaux de 8 bits (donc le type std::uint8_t, généralement unsigned char), donc une couleur codée sur 24 bits (3 octets). L'alternative serait de déclarer la couleur comme un entier de type std::uint16_t (généralement short) et de gérer manuellement les bits :
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 #include <iostream> #include <cstdint> struct Color565 { std::uint16_t B:5; // maximum: 2^5 - 1 = 31 = 0x1f std::uint16_t G:6; // maximum: 2^6 - 1 = 63 = 0x3f std::uint16_t R:5; // maximum: 2^5 - 1 = 31 = 0x1f }; void print_color(Color565 c) { std::cout << c.B << ", " << c.G << ", " << c.R << std::endl; } using ManualColor565 = std::uint16_t; void print_manual_color(ManualColor565 mc) { std::cout << (mc & 0x1f) << ", " << ((mc >> 5) & 0x3f) << ", " << ((mc >> (5+6)) & 0x1f) << std::endl; } int main(int argc, char* argv[]) { std::cout << sizeof(Color565) << std::endl; std::cout << sizeof(ManualColor565) << std::endl; Color565 c; c.B = 12; c.G = 52; c.R = 30; print_color(c); ManualColor565& mc = *reinterpret_cast<ManualColor565*>(&c); print_manual_color(mc); mc = 0; mc |= 20 << 0; mc |= 15 << 5; mc |= 2 << (5+6); print_manual_color(mc); print_color(c); return 0; }
Merci c'est plus clair maintenant :)
Ah zut, tu as été trop rapide. J'ai ajouté quelques explications plus spécifiques à ton cas dans mon premier post.