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

Я довольно плохо знаком с C# и пытающийся сделать основное программное обеспечение обработки изображений. Я понимаю, что этот отрывок извлекает A, R, G, B от международного значения ARGB "текущего" пикселя WriteableBitmap

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 для замены исходного пикселя новым?

Заранее спасибо.

Править: спасибо парни, это имеет смысл теперь.

10
задан Hosain 15 August 2010 в 01:07
поделиться

3 ответа

Это оператор двоичного сдвига.

Если у вас есть цвет, определяемый (a, r, g, b), его двоичное представление будет выглядеть следующим образом (при глубине канала 8 бит):

AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB

Итак, сдвиньте все это на 24 места и у вас останется альфа-канал

AAAAAAAA

Сдвиньте на 16, и вы получите альфа-канал и красный канал

AAAAAAAARRRRRRRR

Теперь, поскольку он приведен как байт, извлекаются только первые 8 бит

(byte)AAAAAAAARRRRRRRR == RRRRRRRR

Вы также можете получить красный канал, сдвинув 16 разрядов и сложив AND с 11111111 (0xFF)

AAAAAAAARRRRRRRR &
0000000011111111
----------------
00000000RRRRRRRR
16
ответ дан 3 December 2019 в 15:05
поделиться

Сдвигает биты текущего значения вправо. В случае этого конкретного фрагмента кода, похоже, он извлекает каждый байт информации о цвете из выбранного элемента массива растровых изображений в отдельные байты цвета.

http://msdn.microsoft.com/en-us/library/xt18et0d.aspx

Предполагая, что ваш массив содержит целые числа, чтобы вернуть вычисленное значение обратно в элемент массива, вы должны отменить битовый сдвиг обработать и ИЛИ результаты обратно вместе, например:

int current = (alpha << 24) | (red << 16) | (green << 8) | blue; 
12
ответ дан 3 December 2019 в 15:05
поделиться

В дополнение к ответу Роберта - и чтобы охватить вторую часть вашего вопроса - вы можете объединить разделите компоненты обратно на целое число, используя операторы << (сдвиг влево) и | (побитовое ИЛИ) :

int combined = (alpha << 24) | (red << 16) | (green << 8) | blue;
2
ответ дан 3 December 2019 в 15:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: