运营商“<<<”在C#中意味着什么?

时间:2010-01-05 16:42:07

标签: c# operators

我正在使用NAudio包在C#中进行一些基本的音频编程,我遇到了以下表达式,我不知道这意味着什么,因为我从未见过<<之前使用的运算符。那么什么<<意思?

请快速解释一下这个表达。

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

9 个答案:

答案 0 :(得分:62)

定义

  

左移运算符(&lt;&lt;&gt;)移位   它的第一个操作数由数字留下   由第二个指定的位数   操作数。第二种类型   操作数必须是int。   << Operator (MSDN C# Reference)   alt text

对于二进制数,它是一个按位运算,它会移动其操作数的所有位;操作数中的每一位都只是移动了给定数量的位位置,空位位置被填充。

用法

算术移位可用作以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)

正如一些人已经指出的那样,这是一次轮班行动。

然而值得注意的是,根据操作数是有符号整数类型还是无符号整数类型,它将应用算术或逻辑移位。

请参阅本页底部on msdn.

答案 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