2014-08-21 9 views
0
public int getRGB(Object inData) { 
    return (getAlpha(inData) << 24) 
     | (getRed(inData) << 16) 
     | (getGreen(inData) << 8) 
     | (getBlue(inData) << 0); 

} 

Итак, что на самом деле делает это заявление возврата? Четыре ints сдвинуты, но что возвращается?Что означает «(a << 24 | b << 16 | c << 8 | d)» означает?

+0

Вы знакомы с побитовыми операторами? – templatetypedef

+3

"_что возвращается? _" Инт. – csmckelvey

+1

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html –

ответ

9

Он возвращает int, чей первый (MSB) байт является значением Alpha, его второй байт является красным, его третий байт является значением Green, а его последним байтом является значение Blue.

highest        lowest 
    bit         bit 
    |--------|--------|--------|--------| 
     Alpha  Red  Green Blue 
    (8 bits) (8 bits) (8 bits) (8 bits) 
4

Что вы получите следующее:

Альфа | Красный | Зеленый | Синий - 32-битное значение ARGB - по 8 бит для каждого. Как вы можете видеть, альфа сдвигается на 24 бита влево (самые левые - самые значащие бит), после чего появляется красный цвет с 8 битами, тем самым помещая красный во второй первый 8 бит и маскируя оставшиеся 16. После этого зеленый сдвиг с 8 бит, маскируя последний байт, и, наконец, синий помещается на свое место.

0

| является побитовое ИЛИ со строгой оценки, в отличие от ||, что может остановить оценку заявлений в состоянии, как только одно выражение возвращает true. Но эти методы (предположительно) возвращают целые числа, поэтому в Java вы (насколько мне известно) не могут протестировать их напрямую с true. Нет проблем, так как это не то, что вы делаете - вы меняете индивидуальные результаты из методов, заполняя новые бит с помощью 0 и отключая старые. То, что это достигается, состоит в том, чтобы упаковать (предположительно) положительные значения с наибольшим байтом (от 0 до 255) в одном из 4 байтов, которые составляют целое число. По сути, это упаковка 4 частей информации, которые требуют по одному байту в одну переменную типа integer. Тип целевой переменной может быть любым, если у него достаточно байт для хранения информации, но оттуда он становится более неаккуратным и сомнительным.

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