Я подозреваю, что это связано с переключением между 555 и 565 цветами.
Да, это то, что он делает. color
будет представлением 565, а crap
соответствующим представлением 555.
Давайте посмотрим, что делает каждая операция. Я буду ссылаться на три поля как a
(5 бит), b
(6 бит, преобразуется в 5) и c
(5 бит).
(color & 0xffc0)
очищает нижние 6 битов слова, удаляя c
и младший значащий бит b
, сохраняя a
и старшие 5 битов b
.
>> 1
сдвигает эти биты вправо, поэтому теперь у нас есть a
(5 бит), b
(5 бит) и пустое 5-битное поле.
(color & 0x1f)
очищает все биты, кроме младших 5 битов, то есть сохраняет 'c' и удаляет другие поля.
Наконец, |
объединяет два значения, давая a
и b
с левой стороны и c
с правой стороны, каждое в 5 битах.
Как бы я создал функцию, которая работает в точности как в коде выше? Что преобразует переменную обратно в исходный номер цвета?
color = ((crap & 0xffe0) << 1) | (crap & 0x1f);
Обратите внимание, что младший значащий бит b
теперь равен нулю, с чего бы это ни было начинать. Эта информация была потеряна при первом преобразовании и не может быть восстановлена.