Как увеличить шестнадцатеричное число 0x1234 до 0x11223344 высокопроизводительным способом?
unsigned int c = 0x1234, b;
b = (c & 0xff) << 4 | c & 0xf | (c & 0xff0) << 8
| (c & 0xff00) << 12 | (c & 0xf000) << 16;
printf("%p -> %p\n", c, b);
Вывод:
0x1234 -> 0x11223344
Мне нужно это для преобразования цвета. Пользователи предоставляют свои данные в форме 0xARGB, и мне нужно преобразовать ее в 0xAARRGGBB
. И да, могут быть миллионы, потому что каждый может быть пикселем. 1000x1000 пикселей равно одному миллиону.
Реальный случай еще сложнее, потому что одно 32-битное значение содержит цвета переднего и заднего плана. Итак 0xARGBargb
стать: [ 0xAARRGGBB, 0xaarrggbb ]
О да, еще одна вещь, в реальном приложении я также отрицаю альфа, потому что в OpenGL 0xFF непрозрачен, а 0x00 является наиболее прозрачным, что неудобно в большинстве случаев, потому что обычно вам нужна часть RGB
, а прозрачность считается не существующей.