Операция & с 0xff
и т.п. применяет битовую маску.Это побитовая и операция.Поскольку int в Java является 32-битным, вы можете читать 0xff
как 00000000_00000000_00000000_11111111
, 0xff00
как 00000000_00000000_11111111_00000000
и так далее.Они просто пропускают ведущие нули.
Так что, если вы делаете pixels[i] & 0xff
, то происходит то, что вы получаете целое число, последние 8 битов которого совпадают с пикселями [i], а остальные установлены наноль.
Оператор >>
- это сдвиг вправо.Это сместит битовую комбинацию вправо на указанное количество битов.Если b
содержит 00110011_11001100_00010110_01001100
, а вы b >> 8
, вы получите 00000000_00110011_11001100_00010110
.Последние 8 битов «выпали», в то время как влево смещены нули. Я не помню, сместится ли эта операция на 1 влево, если начальный бит был 1, поэтому, возможно, кто-то может подтвердить или опровергнуть это.
Зная это, давайте взглянем на эту строку:
int gray = ((pixels[i] & 0xff) + ((pixels[i] & 0xff00) >> 8) + ((pixels[i] & 0xff0000) >> 16)) / 3;
Здесь происходит то, что мы делаем int следующим образом (не точный порядок выполнения кода, просто для иллюстрации):
- пикселей [i] маскируется, поэтому сохраняются только последние 8 битов, остальные становятся равными 0.
- пикселей [i] маскируется, так что только биты 8 - 15 (считая справа)слева, начиная с 0), остальные становятся 0. Затем результат сдвигается на 8 бит вправо.Если бы мы начали с 00001111_00001111_10101010_00110011, это привело бы к 00000000_00000000_00000000_10101010.
- пикселей [i] замаскировано, так что сохраняются только биты 16 - 23, а затем сдвинуто на 16 бит вправо.
- результатыиз вышеперечисленных трех операций добавляются и ...
- этот результат делится на 3.
Так чего же это дает?Что же, в сущности, сводится к тому, что первые 8 бит пикселей [i] игнорируются, а следующие 3 секции по 8 битов интерпретируются как одно значение от 0 до 255, из которого берется среднее значение.
Затем этот результат сравнивается со 128. Если оно меньше, то в пикселях [i] я устанавливаю 0xff000000, в противном случае он устанавливается в 0xffffffff.
Это типичное изменение тренда, с которым вы можете столкнуться при операциях с цветами.закодированы как целыеВероятно, это схема argb, где первые 8 битов int являются альфа-каналом (прозрачность), следующие 8 битов красного цвета, следующие 8 битов зеленого цвета, а последние 8 битов синего цвета.Или его вариант.0xff000000 будет полностью непрозрачным черным, а 0xffffffff - полностью непрозрачным белым.