Возвращаясь к чему-то - PullRequest
       3

Возвращаясь к чему-то

1 голос
/ 12 октября 2011
word color;

crap = ((color & 0xffc0) >> 1) | (color & 0x1f)

У меня есть этот код переключения.Я понятия не имею, для чего предназначен этот код, но я подозреваю, что он как-то связан с переключением между 555 и 565 цветами.

Как бы я создал функцию, которая будет работать в точности так же, как в коде выше?Что преобразует переменную обратно в исходный номер цвета?

Ответы [ 4 ]

3 голосов
/ 12 октября 2011

Вы не можете.«И» (&) и «или» (|) не имеют инверсии (как и сдвиг битов при переполнении).Это означает, что может быть несколько значений color, которые могут превратиться в crap.

2 голосов
/ 12 октября 2011

Я подозреваю, что это связано с переключением между 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 теперь равен нулю, с чего бы это ни было начинать. Эта информация была потеряна при первом преобразовании и не может быть восстановлена.

1 голос
/ 12 октября 2011

Строго говоря, вы не можете этого сделать, поскольку преобразование необратимо удаляет пятый младший значащий бит color (он сохраняет все остальные биты).

Предполагая, что пятый бит не содержит ни одногоДля начала полезные данные, следующее даст вам обратное преобразование:

color = ((crap & 0xffe0) << 1 | (crap & 0x1f))

Опять же, это восстанавливает color за исключением пятого бита , который был потерян.

0 голосов
/ 12 октября 2011

Да, похоже, он преобразует 565 RGB в 555 RGB, отбрасывая младший бит G.

Вы теряете один бит, поэтому вы не можете точно его инвертировать (самый младший битG только что ушел), но вы можете приблизить обратное, выполнив что-то вроде этого:

color = ((crap & 0xffe0) << 1) | (crap & 0x1f)

Первая часть, ((crap & 0xffe0) << 1), просто маскирует компоненты R и G и сдвигает их обратно вверх.Последняя часть, | (crap & 0x1f), маскирует синий цвет и добавляет его обратно в результат.

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