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

Что означает оператор "<<" в С#?

Я делал некоторые базовые аудиопрограммы на С#, используя пакет NAudio, и я натолкнулся на следующее выражение, и я понятия не имею, что это значит, поскольку я никогда не видел < используемый ранее. Итак, что означает < < означает?

Прошу дать краткое объяснение этого выражения.

short sample = (short)((buffer[index + 1] << 8) | buffer[index + 0]);
4b9b3361

Ответ 1

Определение

Оператор левого сдвига (< <) сдвигаетс его первый операнд, оставленный номером бит, указанный его вторым операнд. Тип второго операнд должен быть int. < < Оператор (ссылка MSDN С#) alt text

Для двоичных чисел это побитовая операция, которая сдвигает все биты своего операнда; каждый бит в операнде просто перемещается с заданным количеством позиций битов, а свободные позиции бит заполняются.

Использование

Арифметические сдвиги могут быть полезны как эффективные способы выполнения умножения или деления целых чисел со знаком по степеням двух. Переход слева на n битов на двоичный номер с подписью или без знака приводит к умножению его на 2 n. Смещение справа на n бит на двоичном числе, подписанном двумя дополнениями, приводит к делению его на 2 n но оно всегда округляется вниз (к отрицательной бесконечности). Это отличается от того, как округление обычно выполняется в значении целочисленного деления (которое округляется до 0). Это несоответствие привело к ошибкам в нескольких компиляторах.

Другое использование - работа с битами цвета. Основы Чарльза Петцольда статья "Растровые изображения и пиксельные биты" показывает пример < при работе с цветами:

ushort pixel = (ushort)(green << 5 | blue);

Ответ 2

Сдвиг влево (и противоположный, Shift right) перемещает биты в заданном направлении.

Сдвиг влево более или менее раз 2, но быстрее

Сдвиг вправо более или менее разделен на 2, но быстрее

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

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