Что делает оператор “<<”, означают в C#?

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

Дайте быстрый explaination этого выражения.

short sample = (short)((buffer[index + 1] << 8) | buffer[index + 0]);
32
задан Jon Seigel 7 April 2010 в 01:09
поделиться

9 ответов

Definition

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

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

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

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

Другое использование - работа с цветовыми битами . Charles Petzold Foundations article "Bitmaps And Pixel Bits" показывает пример << при работе с цветами:

ushort pixel = (ushort)(green << 5 | blue);
62
ответ дан 27 November 2019 в 20:05
поделиться

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

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

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

.
8
ответ дан 27 November 2019 в 20:05
поделиться

Это операция сдвига левого бита, ОЧЕНЬ общая идиома программирования: http://en.wikipedia.org/wiki/Arithmetic_shift

6
ответ дан 27 November 2019 в 20:05
поделиться

Это называется левый оператор.

Следуйте по этой ссылке для получения более подробной информации.

3
ответ дан 27 November 2019 в 20:05
поделиться

левая смена Вот несколько msdn, которые помогут вам: http://msdn.microsoft.com/en-us/library/ayt2kcfb(VS.80).aspx

1
ответ дан 27 November 2019 в 20:05
поделиться

Оператор "<<" - сдвиг влево. x << y сдвигает битовую схему x y позиции влево.

Например, если бы x было 0001 0101 и y было бы 1, то результат был бы 0010 1010. Как будто кто-то толкнул каждый бит налево.

1
ответ дан 27 November 2019 в 20:05
поделиться
[

] Битовый оператор уже несколько раз объяснялся. Допустим, []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
] [

]И оператор "|" (bitwise OR) заставляет просто сложить два значения вместе и сравнить бит на бит.[

] [
  0000 0001 0000 0000
| 0000 0000 0000 0010
= 0000 0001 0000 0010
] [

]И конечное значение хранится в переменной "sample" (в данном случае 258.) Обратная операция аналогична:[

] [
buffer[0] = sample & 255;
buffer[1] = (sample & (255 << 8)) >> 8;
]
2
ответ дан 27 November 2019 в 20:05
поделиться
[

] Как уже указывали несколько человек, это операция сдвига.[

] [

][]Однако[] Стоит отметить, что в зависимости от того, является ли операнд знаковым интегральным типом или беззнаковым интегральным типом, он будет применять либо арифметический, либо логический сдвиг. [

] [

]Смотрите внизу этой страницы [] на msdn.[][

]
1
ответ дан 27 November 2019 в 20:05
поделиться
[

] Как говорили другие, оператор << сдвигает биты числа влево. Обычная причина, по которой кто-то делает это в приложении Audio, состоит в том, чтобы объединить два 8-битных монообразца (один для левого и правый) в 16-битный стериальный сэмпл.[

] [

]Таким образом, в коде сэмпла выглядит так, как будто в Buffer есть стериальный сэмпл, закодированный с левым и правым сэмплами поочередно. Перемещая первую левую 8-ю и вторую, автор объединяет их в 16-битную стерио сэмпл, при этом High 8-бит является одним каналом, а low 8-бит - другим. [

] [

]Если в вашем примере буфер содержал:[

] [
1001 0100 (Right)
1001 0011 (Left)
] [

]Результат, который вы получите в выборке:[

] [
(Left)    (Right)
1001 0011 1001 0100
]
1
ответ дан 27 November 2019 в 20:05
поделиться
Другие вопросы по тегам:

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