Подтвердить что ты не робот

Что делает оператор >> в С#?

Я новичок в С# и пытаюсь сделать базовое программное обеспечение для обработки изображений. Я понимаю, что этот фрагмент извлекает 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, чтобы заменить исходный пиксель на новый?

Спасибо заранее.

Изменить: спасибо, ребята, теперь это имеет смысл.

4b9b3361

Ответ 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;