Предположим, что a = 0xf000
и b = 0x000f
.
x | y
является bitwise or. Каждый бит в x
, y
или оба будут установлены на 1
на результирующем выходе. a | b
станет 0xf00f
. b | b
станет 0x000f
.
x << num
является left shift. Каждый бит в x
будет сдвинут num
местами слева. Значения, сдвинутые слева, теряются, новые значения справа равны нулю. b << 4
станет 0x00f0
и a << 4
станет 0x0000
.
Итак, давайте разложим код, который вы выбрали. Первая часть, похоже, просто получает зеленое значение как int (которое будет иметь двоичное представление). Вторая часть более интересна:
// Start
rgb = (0xff000000) | (0 << 16) | (r << 8) | (0 << 0);
// 1. Do the parts in parentheses. Notice the green value was shifted over two bits
rgb = 0xff000000 | 0x00000000 | 0x0000rr00 | 0x00000000;
// 2. Apply the ORs
rgb = 0xff00rr00;
Так что же происходит? Похоже, это устанавливает альфа (первые два байта) для всех 1, поэтому цвет непрозрачен. Затем он возвращает красный (второй два байта) и синий (последние два байта). Он сохраняет зеленый цвет, смещая бит в зеленую часть представления RGB. Это работает, потому что RGB hex representation выглядит как 0xAARRGGBB
, где A - альфа, R - красный, G - зеленый, а B - синий.
Hey thnx, но не могли бы вы рассказать мне, что такое точное значение r в битах после r = c.getGreen(); – user2485269
@ user2485269 Это будет любое значение, возвращаемое 'getGreen()'. В этом случае, похоже, это зеленое значение для пикселя в данной точке битового массива 'bi' (обратите внимание, что для циклов, проходящих по длине и ширине изображения). Он должен быть целым числом от 0 ('0x00') до 255 (' 0xff'), которое может быть представлено в двух байтах. Java использует знаковые целые числа, поэтому базовые биты будут такими, как '0x00 ... 0gg', где' gg' - это зеленое значение. – thegrinner