Я делал некоторое основное программирование аудио в C# с помощью пакета NAudio, и я столкнулся со следующим выражением, и я понятия не имею, что это означает, поскольку я никогда не видел <<оператор, используемый прежде. Таким образом, что делает <<средний?
Дайте быстрый explaination этого выражения.
short sample = (short)((buffer[index + 1] << 8) | buffer[index + 0]);
Оператор левого сдвига (<<) смещает его первый операнд, оставленный по номеру битов, указанных его вторым Операнд. Тип второго Операнд должен быть информатором. <<оператор (MSDN C# Ссылка)
Для двоичных чисел это битовая операция, сдвигающая все биты его операнда; каждый бит в операнде просто сдвигает заданное количество битовых позиций, а свободные битовые позиции заполняются.
Арифметические сдвиги могут быть полезны в качестве эффективных способов выполнения умножения или деления подписанных целых на степени двойки. Смещение влево на n бит на знаковое или неподписанное двоичное число приводит к его умножению на 2n. Смещение вправо на n бит на подписанном двоичном номере дополнения двоичной системы с двумя битами приводит к делению на 2n, но всегда округляет в меньшую сторону (в сторону отрицательной бесконечности). Это отличается от способа округления, который обычно выполняется при знаковом целочисленном делении (которое округляется до 0). Это расхождение привело к ошибкам в более чем одном компиляторе.
Другое использование - работа с цветовыми битами . Charles Petzold Foundations article "Bitmaps And Pixel Bits" показывает пример << при работе с цветами:
ushort pixel = (ushort)(green << 5 | blue);
Сдвиг влево (и контрагент, Shift вправо) перемещает биты в заданном направлении.
Сдвиг влево более или менее раз 2, но быстрее
Сдвиг вправо более или менее разделен на 2, но быстрее
.Это операция сдвига левого бита, ОЧЕНЬ общая идиома программирования: http://en.wikipedia.org/wiki/Arithmetic_shift
Это называется левый оператор.
Следуйте по этой ссылке для получения более подробной информации.
левая смена Вот несколько msdn, которые помогут вам: http://msdn.microsoft.com/en-us/library/ayt2kcfb(VS.80).aspx
Оператор "<<" - сдвиг влево. x << y сдвигает битовую схему x y позиции влево.
Например, если бы x было 0001 0101 и y было бы 1, то результат был бы 0010 1010. Как будто кто-то толкнул каждый бит налево.
] Битовый оператор уже несколько раз объяснялся. Допустим, []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;
] ] Как уже указывали несколько человек, это операция сдвига.[
] [][]Однако[] Стоит отметить, что в зависимости от того, является ли операнд знаковым интегральным типом или беззнаковым интегральным типом, он будет применять либо арифметический, либо логический сдвиг. [
] []Смотрите внизу этой страницы [] на msdn.[][
]] Как говорили другие, оператор << сдвигает биты числа влево. Обычная причина, по которой кто-то делает это в приложении Audio, состоит в том, чтобы объединить два 8-битных монообразца (один для левого и правый) в 16-битный стериальный сэмпл.[
] []Таким образом, в коде сэмпла выглядит так, как будто в Buffer есть стериальный сэмпл, закодированный с левым и правым сэмплами поочередно. Перемещая первую левую 8-ю и вторую, автор объединяет их в 16-битную стерио сэмпл, при этом High 8-бит является одним каналом, а low 8-бит - другим. [
] []Если в вашем примере буфер содержал:[
] [1001 0100 (Right)
1001 0011 (Left)
]
[]Результат, который вы получите в выборке:[
] [(Left) (Right)
1001 0011 1001 0100
]