我正在使用NAudio包在C#中进行一些基本的音频编程,我遇到了以下表达式,我不知道这意味着什么,因为我从未见过<<之前使用的运算符。那么什么<<意思?
请快速解释一下这个表达。
short sample = (short)((buffer[index + 1] << 8) | buffer[index + 0]);
答案 0 :(得分:62)
左移运算符(&lt;&lt;&gt;)移位 它的第一个操作数由数字留下 由第二个指定的位数 操作数。第二种类型 操作数必须是int。 << Operator (MSDN C# Reference)
对于二进制数,它是一个按位运算,它会移动其操作数的所有位;操作数中的每一位都只是移动了给定数量的位位置,空位位置被填充。
算术移位可用作以2的幂执行有符号整数的乘法或除法的有效方法。通过有符号或无符号二进制数上的 n 位向左移动会产生乘以 2 n 的效果。通过二进制补码有符号二进制数上的 n 位向右移动可以将其除以 2 n ,但它总是向下舍入(朝向负无穷大)。这与通常在有符号整数除法(向0舍入)中进行舍入的方式不同。这种差异导致了多个编译器中的错误。
另一种用法是使用颜色位。 Charles Petzold基金会article "Bitmaps And Pixel Bits"显示了&lt;&lt;&lt;使用颜色时:
ushort pixel = (ushort)(green << 5 | blue);
答案 1 :(得分:8)
向左移动(和对应方向右移)在给定方向上移动位。
向左移动或多或少是2倍,但更快
右移或多或少除以2,但更快
答案 2 :(得分:6)
这是一个左移位操作,非常常见的编程习惯用法:http://en.wikipedia.org/wiki/Arithmetic_shift
答案 3 :(得分:3)
它被称为左移运算符。
关注this链接以获取更多详细信息。
答案 4 :(得分:2)
已经多次解释了按位运算符。假设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
和“|”运算符(按位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;
答案 5 :(得分:1)
左移 这里有一些msdn可以帮助你:http://msdn.microsoft.com/en-us/library/ayt2kcfb(VS.80).aspx
答案 6 :(得分:1)
答案 7 :(得分:1)
“&lt;&lt;&lt;是左移操作员。 x &lt;&lt; y 将位模式 x y 位置左移。
例如,如果 x 0001 0101 且 y 为1,则结果为 0010 1010 。这就像有人把每一位都推到了一边。
答案 8 :(得分:1)
正如其他人所说&lt;&lt;运算符移动一个数字的位。有人在音频应用中执行此操作的正常原因是将两个8位单声道样本(左右一个)合并为16位立体声样本。
因此在示例代码中,看起来Buffer包含在备用样本中左右编码的sterio。通过移动第一个左边8和第二个边缘,作者将它们组合成一个16位的立体声样本,其中高8位是一个通道而低8位是另一个通道。
如果在您的示例中缓冲区包含:
1001 0100 (Right)
1001 0011 (Left)
您将获得样本的结果是:
(Left) (Right)
1001 0011 1001 0100