2013-11-20 10 views
0
11111 111111 11111 > 16 bit 
    R  G  B 

Как я могу получить значения R/G/B?Десятичное значение из группы бит в словесном математическом объяснении

R = x/2048 (2048 are the 6+5 G+B 11 bit) 
G = x-R*2048/32 (32 are the B) 

есть простое объяснение этого? почему десятичное значение должно быть делено на бит другого, чтобы получить значение одной группы?

+0

Вы можете увидеть, как маски и сдвигают – Jekyll

+0

ума вашего Operator Precedence: ваш расчет 'G' ошибается о любом языке программирования, я знаю, (.. кроме Postscript, но это только потому, что это постфиксный язык, поэтому вы не могли совершить с ним ту же ошибку). – usr2564301

ответ

0

Если вы хотите получить R, вам нужно переместить 11 бит справа, чтобы G и B исчезли. Так

R=x>>11

но каждый сдвиг 1 бит эквивалентен делению на 2, так что приведенное выше выражение эквивалентно

R=X/(2^11)=x/2048 

И так что вы получите Р.

Чтобы получить G, в соответствии с формулой, вы можете сначала удалить R, то есть R, полученное ранее, но сдвинуть назад 11 бит (или умножить на 2048). Теперь это сделали вы ряд, как:

111111 11111 

Вы сдвиг влево 5 бит (или разделить на 32), и вы получите результат.

Обратите внимание, что на практике вы можете сделать это легче сделать это:

B=(x and 0x1F) 
G=((x>>5) and 0x3F) 
R=((x>>11) and 0x1F) 
+1

Лучше сделайте это последнее 'и 0x3F' - вы не знаете, где он был. – usr2564301

+0

ура, исправлено ... опечатка там :), 0x1F там ... есть 5 бит ... – Jekyll