Как разложить цвет с помощью оператора по модулю в C? - PullRequest
0 голосов
/ 27 мая 2020

Назовем информацию о цвете в шестнадцатеричной форме int color_hex

В C Language я использую побитовый оператор (>>), чтобы разложить его на R (красный), G (зеленый) и B (Синий).

Красный: (color_hex >> 16) & 0xFF
Зеленый: (color_hex >> 8) & 0xFF
Синий: (color_hex >> 0) & 0xFF

С этим проблем нет, правда?

Я недавно видел, как кто-то другой делал иначе, а именно:

Красный: (color_hex >> 16) % 256 / 255.0
Зеленый: (color_hex >> 8) % 256 / 255.0
Синий: (color_hex >> 0) % 256 / 255.0

Я не понимаю, как это работает.

1) Что здесь делает оператор по модулю?
2) А как насчет деления на 255.0?

1 Ответ

3 голосов
/ 27 мая 2020

Методы производят два разных представления цветов. Один представляет интенсивность каждого цвета как целое число от 0 до 255 (включительно). Другой представляет интенсивность каждого цвета в виде числа с плавающей запятой от 0 до 1 (включительно).

Пока x является неотрицательным целым числом, x & 0xFF эквивалентно x % 256 . Оператор % возвращает остаток после деления; x % 256 - это остаток от деления x на 256. & выполняет побитовое И; x & 0xFF производит младшие восемь битов x. Поскольку все биты выше восьмого бита представляют степени двойки, равные 256 или более, использование только младших восьми бит эквивалентно удалению всех кратных 256, оставляя только остаток. Вот почему x & 0xFF и x % 256 эквивалентны неотрицательному x. (Для отрицательных x они различаются из-за того, как отрицательные числа представлены битами, и из-за того, что % дает отрицательный остаток.) ​​

Поскольку они эквивалентны, компилятор должен оптимизировать их для одного и того же кода , если он знает, что левый операнд неотрицателен.

Таким образом, оба метода, показанные в вопросе, до этого момента идентичны. Последний просто делится на 255.0, чтобы масштабировать результат от 0-255 до 0-1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...