Что означает оператор "<<" в С#?
Я делал некоторые базовые аудиопрограммы на С#, используя пакет NAudio, и я натолкнулся на следующее выражение, и я понятия не имею, что это значит, поскольку я никогда не видел < используемый ранее. Итак, что означает < < означает?
Прошу дать краткое объяснение этого выражения.
short sample = (short)((buffer[index + 1] << 8) | buffer[index + 0]);
Ответы
Ответ 1
Определение
Оператор левого сдвига (< <) сдвигаетс его первый операнд, оставленный номером бит, указанный его вторым операнд. Тип второго операнд должен быть int. < < Оператор (ссылка MSDN С#) ![alt text]()
Для двоичных чисел это побитовая операция, которая сдвигает все биты своего операнда; каждый бит в операнде просто перемещается с заданным количеством позиций битов, а свободные позиции бит заполняются.
Использование
Арифметические сдвиги могут быть полезны как эффективные способы выполнения умножения или деления целых чисел со знаком по степеням двух. Переход слева на n битов на двоичный номер с подписью или без знака приводит к умножению его на 2 n. Смещение справа на n бит на двоичном числе, подписанном двумя дополнениями, приводит к делению его на 2 n но оно всегда округляется вниз (к отрицательной бесконечности). Это отличается от того, как округление обычно выполняется в значении целочисленного деления (которое округляется до 0). Это несоответствие привело к ошибкам в нескольких компиляторах.
Другое использование - работа с битами цвета. Основы Чарльза Петцольда статья "Растровые изображения и пиксельные биты" показывает пример < при работе с цветами:
ushort pixel = (ushort)(green << 5 | blue);
Ответ 2
Сдвиг влево (и противоположный, Shift right) перемещает биты в заданном направлении.
Сдвиг влево более или менее раз 2, но быстрее
Сдвиг вправо более или менее разделен на 2, но быстрее
Ответ 3
Это операция сдвига левого бита, ОЧЕНЬ общая идиома программирования: http://en.wikipedia.org/wiki/Arithmetic_shift
Ответ 4
Он называется оператором левого сдвига.
Подробнее см. эту ссылку.
Ответ 5
Побитовый оператор уже объяснен уже несколько раз. Скажем, что buffer[0]
содержит 1, buffer[1]
содержит 2 и index
равно 0 и заменяет эти значения:
short sample = (short)((buffer[1] << 8) | buffer[0]);
short sample = (short)((1 << 8) | 2);
Теперь полуграфическое представление. Это число 1 в двоичном представлении:
0000 0001
Смещение восьми позиций влево сделает этот номер "переполнением" из одного байта. Однако компилятор достаточно умен, чтобы дать нам больше места.
0000 0001 0000 0000
Теперь, правая часть: число 2 выглядит так в двоичном виде:
0000 0010
И "|" оператор (побитовое ИЛИ) просто объединяет два значения и сравнивает бит на бит.
0000 0001 0000 0000
| 0000 0000 0000 0010
= 0000 0001 0000 0010
И окончательное значение сохраняется в вашей переменной "sample" (в этом случае 258.) Обратная операция аналогична:
buffer[0] = sample & 255;
buffer[1] = (sample & (255 << 8)) >> 8;
Ответ 6
Сдвиг влево
Вот несколько msdn, которые помогут вам: http://msdn.microsoft.com/en-us/library/ayt2kcfb(VS.80).aspx
Ответ 7
Как уже отмечалось несколькими людьми, это операция переключения.
Однако Стоит отметить, что в зависимости от того, является ли операнд подписным интегральным типом или неподписанным интегральным типом, он будет применять либо арифметический, либо логический сдвиг.
См. нижнюю часть этой страницы в msdn.
Ответ 8
"< является сдвигом влево. x < y сдвигает битовый рисунок x y влево.
Например, если x равно 0001 0101, а y равно 1, тогда результат будет равен 0010 1010. Это похоже на то, что кто-то нажал на каждый бит, оставив один.
Ответ 9
Как отмечают другие, оператор перемещает биты числа слева. Обычная причина, по которой кто-то мог сделать это в приложении Audio, состоит в том, чтобы объединить два 8-битных моно-выборки (один для левого и правого) в 16-разрядный образец стери.
Итак, в примере кода выглядит так, что Buffer содержит стерирование, закодированное слева и справа в альтернативных образцах. Перемещая первый левый 8 и поворачивая второй, автор объединяет их для формирования 16-битного стерического образца с высоким 8 битами, являющимся одним каналом, а нижние 8 бит - другим.
Если в вашем примере буфер содержал:
1001 0100 (Right)
1001 0011 (Left)
Результат, который вы получите в примере:
(Left) (Right)
1001 0011 1001 0100