Использование логического сдвига для значений RGB - PullRequest
4 голосов
/ 22 апреля 2011

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

var color:uint = myObject.color;
var red:uint = color >>> 16;
var green:uint = color >>> 8 & 0xFF;
var blue:uint = color & 0xFF;

Мне было интересно, что именно `& 0xFF 'делает с зеленым и синим.Я понимаю, что делает операция И, но зачем она нужна (или хорошая идея) здесь?

Источник этого кода был здесь: http://alexgblog.com/?p=680

Цените советы.Alex

1 Ответ

13 голосов
/ 22 апреля 2011

В RGB у вас есть 8 бит для красного, 8 бит для зеленого и 8 бит для синего. Вы храните 3 байта в int, который имеет 4 байта следующим образом:

  • Биты от 0-7 (наименее значимые) для Blue.
  • Биты с 8-15 (наименее значимые) для Грина.
  • Биты с 16 по 23 (наименее значимые) для красных.

Чтобы извлечь их в отдельные значения, вам нужно сдвинуть вправо правильное количество битов, чтобы поместить байт, соответствующий цвету, который вы хотите извлечь, в младший байт целого числа, а затем поместить оставшуюся часть целого числа. в 0, чтобы позволить только это значение байта. Последняя часть выполняется с помощью операции AND с маской 0xFF. AND оставляет единственный байт целого, где он применяется, с тем же значением, оставляя остальные байты в 0.

Вот что происходит:

var color:uint = myObject.color;

У вас есть такая переменная цвета: 0x00RRGGBB

var red:uint = color >>> 16;

Сдвиг вправо 16-битного цвета приводит к: 0x000000RR, что приводит к значению красного цвета.

Но для:

var green:uint = color >>> 8 & 0xFF;

После сдвига вправо цвета 8 битов он оставляет этот результат 0x0000RRGG, но здесь нам нужны только биты GG, поэтому мы применяем операцию И с маской 0xFF или, чтобы быть более ясной, 0x000000FF, поскольку вы знаете, что И оставляет старые Значения битов, где маска равна 1, и нули там, где маска равна 0, поэтому результат выполнения 0x0000RRGG & 0x000000FF = 0x000000GG, который является значением для зеленого. То же самое применяется для извлечения значения синего цвета.

...