2014-10-16 2 views
1

http://tech-algorithm.com/articles/linear-interpolation/Булева логика в линейной интерполяции

Это код.

В коде, приведенном на этой странице, я не мог понять, что это делает

  return 0xff000000 | // alpha 
       ((Yr << 16) & 0xff0000) | 
       ((Yg << 8) & 0xff00) | 
       (Yb & 0xff) ; 

сделать. Чтобы быть более конкретным, я не знаю, что это такое (Yr << 16). Помощь будет высоко оценена.

ответ

1

Это простая функция для преобразования триплета RGB (три знаковых 8-битных значения) в 32-разрядное значение ARGB без знака.

Оператор сдвигает двоичные цифры целого числа влево на указанное количество мест. Так, например, если Yr = 100, Yg = 150 и Yb = 200, то вы бы в конечном итоге с 32-битовым числом 0xFF6496C8, где хранится информация RGB следующим образом:

---- alpha ---- ----- Yr ------ ----- Yg ------ ----- Yb ------ 
[1 1 1 1 1 1 1 1][0 1 1 0 1 0 0 0][1 0 0 1 0 1 1 0][1 1 0 0 1 0 0 0] 
alpha=255=0xFF Yr=0x64=100  Yg=0x96=150  Yb=0xC8=200 

альфа-значение (255), по-видимому, соответствует непрозрачности 100%.

В случае, если вам было интересно, оператор & является логическим оператором AND, который маскирует ненужные биты. В коде, к которому вы привязались, он вообще не нужен, так как значения Yr, Yg и Yb уже находятся в диапазоне от 0 до 255.

Однако оно полезно при извлечении значений RGB из 32-битное целое число ARGB, например:

alpha = (ARGB >> 24) & 0xff; 
Yr = (ARGB >> 16) & 0xff; 
Yg = (ARGB >> 8) & 0xff; 
Yb = ARGB & 0xff; 
+0

Спасибо большое! –

Смежные вопросы