Со следующим классом, предполагая, что RGBA находится в диапазоне от 0 до 255
class Color {
public:
short int r;
short int g;
short int b;
short int a;
Я видел такие библиотеки, как устаревшая библиотека GD, использующая битовый сдвиг и &, например
((r & 0x7F000000) << 24) & ...
но я обеспокоен тем, что это может быть медленным, и я бы предпочел более распространенный подход. Кто-нибудь знает, как я мог бы упаковать значения RGBA в беззнаковое целое без использования чрезмерных побитовых операторов (подход GD использует около 6-8 битовых сдвигов на байт).
union
, который содержитunsigned int
, а также безымянныйstruct
с 4 полямиchar
. Обратите внимание, что 4short int
в вашем фрагменте кода не будет тривиально вписываться вunsigned int
. - person Damon   schedule 23.07.2011rlwimi
op PPC. Я оптимизирую именно такой код для жизни. Предостережение заключается в том, что коэффициент сдвига должен быть непосредственной константой — если вы выполняете сдвиг на переменную величину (например,r << x
, где x — целое число, а не непосредственное), то это будет намного медленнее. Использование объединения обычно медленнее, потому что большинство компиляторов не создают очень хороший код для объединений. (Они могут создать оптимальный код... но не делают этого.) - person Crashworks   schedule 23.07.2011