Что делает оператор >> в С#?
Я новичок в С# и пытаюсь сделать базовое программное обеспечение для обработки изображений. Я понимаю, что этот фрагмент извлекает A, R, G, B из значения ARGB int пиктограммы WriteableBitmap "current"
for(int i = 0; i < bitmapArray.Length; i++) {
var current = bitmapArray[i];
var alpha = (byte)(current >> 24);
var red = (byte)(current >> 16);
var green = (byte)(current >> 8);
var blue = (byte)(current);
//Some code
}
Что такое " → ", чтобы преобразовать значения?
Кроме того, если я выполняю некоторые вычисления для r, g и b отдельно, как мне их преобразовать обратно в целочисленное значение ARGB, чтобы заменить исходный пиксель на новый?
Спасибо заранее.
Изменить: спасибо, ребята, теперь это имеет смысл.
Ответы
Ответ 1
Это оператор двоичного сдвига.
Если у вас есть цвет, определенный (a, r, g, b), это двоичное представление будет выглядеть так (при условии, что глубина канала составляет 8 бит):
AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB
Итак, сдвиньте все это на 24 места, и вы останетесь с альфа-каналом
AAAAAAAA
Сдвиг на 16, и вы получите альфа-канал и красный канал
AAAAAAAARRRRRRRR
Теперь, поскольку это выполняется как байт, извлекаются только первые 8 бит
(byte)AAAAAAAARRRRRRRR == RRRRRRRR
Вы также можете получить красный канал, переместив 16 мест и И'инг с помощью 11111111 (0xFF)
AAAAAAAARRRRRRRR &
0000000011111111
----------------
00000000RRRRRRRR
Ответ 2
Это смещение битов значения current
вправо. В случае этого конкретного фрагмента кода он, как представляется, извлекает каждый байт информации о цвете из выбранного элемента массива растрового изображения в отдельные цветовые байты.
http://msdn.microsoft.com/en-us/library/xt18et0d.aspx
Предполагая, что ваш массив содержит ints, чтобы получить вычисленное значение обратно в элемент массива, вы должны отменить процесс смещения бит и OR, чтобы результаты были объединены, например:
int current = (alpha << 24) | (red << 16) | (green << 8) | blue;
Ответ 3
В ответ на ответ Роберта - и чтобы охватить вторую часть вашего вопроса - вы можете комбинировать отдельные компоненты с целым числом, используя <<
(левый сдвиг) и |
(побитовое ИЛИ):
int combined = (alpha << 24) | (red << 16) | (green << 8) | blue;