#c #colors
#c #Цвет
Вопрос:
word color;
crap = ((color amp; 0xffc0) >> 1) | (color amp; 0x1f)
У меня есть этот код изменения. Я понятия не имею, какова цель этого кода, но я подозреваю, что это как-то связано с переключением между 555 и 565 цветами.
Как бы я создал функцию, которая выполняет прямо противоположное приведенному выше коду? Это преобразует переменную обратно в исходный номер цвета?
Комментарии:
1.
(color amp; 0x1f)
часть в порядке, но((color amp; 0xffc0) >> 1)
кажется неправильной, поскольку это не имеет смысла.2. Если вы понятия не имеете, какова цель этого кода , то как вы можете понять код, который делает прямо противоположное приведенному выше коду ?
Ответ №1:
Вы не можете. «И» ( amp;
) и «или» ( |
) не имеют обратного значения (как и смещение битов при переполнении). Это означает, что может быть несколько значений, color
которые могут превратиться в crap
.
Ответ №2:
Я подозреваю, что это как-то связано с переключением между 555 и 565 цветами.
Да, именно это он и делает. color
будет представление 565 и crap
соответствующее представление 555.
Давайте посмотрим, что делает каждая операция. Я буду называть эти три поля как a
(5 бит), b
(6 бит, преобразованных в 5) и c
(5 бит).
(color amp; 0xffc0)
очищает нижние 6 битов слова, удаляя c
и наименее значимый бит b
, сохраняя a
и наиболее значимые 5 битов b
.
>> 1
сдвигает эти биты вправо, так что теперь у нас есть a
(5 бит), b
(5 бит) и пустое 5-битное поле.
(color amp; 0x1f)
очищает все биты, за исключением нижних 5 битов, то есть сохраняет ‘c’ и удаляет другие поля.
Наконец, |
объединяет два значения, выдавая a
и b
с левой стороны и c
с правой стороны, каждое по 5 бит.
Как бы я создал функцию, которая выполняет прямо противоположное приведенному выше коду? Это преобразует переменную обратно в исходный номер цвета?
color = ((crap amp; 0xffe0) << 1) | (crap amp; 0x1f);
Обратите внимание, что младший значащий бит b
теперь равен нулю, с чего бы он ни начинался. Эта информация была утеряна при первом преобразовании и не может быть восстановлена.
Ответ №3:
Строго говоря, вы не можете, поскольку преобразование необратимо удаляет пятый младший значащий бит color
(он сохраняет все остальные биты).
Предполагая, что пятый бит изначально не содержал никаких полезных данных, следующее даст вам обратную вашему преобразованию:
color = ((crap amp; 0xffe0) << 1 | (crap amp; 0x1f))
Опять же, это восстанавливает, color
за исключением пятого бита, который был потерян.
Ответ №4:
Да, похоже, что он преобразуется из 565 RGB в 555 RGB путем удаления младшего бита G.
Вы теряете один бит, поэтому вы не можете его точно инвертировать (младший бит G просто исчез), но вы можете приблизить обратное, выполнив что-то вроде этого:
color = ((crap amp; 0xffe0) << 1) | (crap amp; 0x1f)
Первая часть ((crap amp; 0xffe0) << 1)
— это просто маскировка компонентов R и G и перенос их обратно. Последняя часть, | (crap amp; 0x1f)
, маскирует синий цвет и добавляет его обратно в результат.