Проверка цвета на соответствие через оператор &
Всем привет. Наткнулся тут на вот такой кусок кода.
for (x=0; x < w; x++) {
for (y = 0; y < h; y++) {
pixel = pixmap.getPixel(x, y);
if ((pixel & 0x000000ff) == 0) {
map[x][y] = 0;
} else {
map[x][y] = 1;
}
}
}
Здесь мы проверяем пиксели на прозрачность. Интерес вызвала конкретно вот эта строчка:
if ((pixel & 0x000000ff) == 0)
Если проверяемый пиксель прозрачный, то присваиваем переменной значение 0, если не прозрачный - значение 1. Не могу понять, почему это работает, ведь проверяемый пиксель может быть цветным, но его двоичный код будет полностью отличаться. Тогда при проверке на выходе значение всё равно будет равно нулю. Также, если проверяемый цвет равен 0x000000ff, то условие тоже должно выполняться, т.к на выходе будет тот же ноль. В таком случае данная проверка не имеет смысла. Знающие люди, объясните пожалуйста.
Ответы (2 шт):
Представьте, что значение pixel—0x38c20a00.
0x38c20a00 & 0x000000ff → 0x00000000
(0x38c20a00 & 0x000000ff) == 0 → 0x00000000 == 0 → true.
То, что вам показали - пример применения битовой маски (в примере выше - 0x000000ff это как раз и есть битовая маска). Чтобы понять приведенный вами фрагмент кода в вопросе вы должны понимать как работает побитовый оператор &, что такое битовая маска и как число записанное в шестнадцатиричной системе счисления перевести в двоичную (например число 0x000000ff в двоичной записи выглядит как 00000000_00000000_00000000_11111111).
И ещё уточните - как именно у вас кодируется каждый пиксель (ARGB или RGBA и т.д.)