运算符"<<"在C#中的含义是什么?

Kur*_*rru 32 c# operators

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

请快速解释一下这个表达方式.

short sample = (short)((buffer[index + 1] << 8) | buffer[index + 0]);
Run Code Online (Sandbox Code Playgroud)

ser*_*hio 62

定义

左移运算符(<<)将其第一个操作数左移第二个操作数指定的位数.第二个操作数的类型必须是int. <<运算符(MSDN C#参考) 替代文字

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

用法

算术移位可以用作以2的幂执行有符号整数的乘法或除法的有效方式.在有符号或无符号二进制数上向左移位n位会产生乘以2 n的效果.在二进制补码有符号二进制数上向右移位n位具有将其除以2 n的效果,但它总是向下舍入(朝向负无穷大).这与通常在有符号整数除法(向0舍入)中进行舍入的方式不同.这种差异导致了多个编译器中的错误.

另一种用法是使用颜色位.Charles Petzold Foundations的文章"Bitmaps和Pixel Bits"显示了<<使用颜色时的一个例子:

ushort pixel = (ushort)(green << 5 | blue);
Run Code Online (Sandbox Code Playgroud)

  • 我更新了这个答案,因为移位乘以/除以 2^n,而不是 2n (3认同)

Ben*_*zun 8

左移(和对应,右移)移动给定方向的位.

向左移动或多或少是2倍,但速度更快

右移或多或少除以2,但速度更快

  • 您可以安全地省略比较乘以或除以2.这让我们得到了另外一批程序员,他们认为通过编写`x << 1`而不是`x*2`可以超越编译器.我没有-1,但很接近. (8认同)
  • @Benjamin:"但更快"的说法具有误导性.我很确定编译器和/或JITter可以识别整数`*2`和`/ 2`计算,并尽可能使用移位指令,因此在C#中没有性能优势. (4认同)
  • 如果意图是算术,我.即 ×2,那么我认为使用位移非常糟糕.如果意图是按位的,我.即 "将这些位移动一点",当然这是正确的习惯用语.请记住,对于阅读代码的人来说,它必须有意义.编译器几乎总是更好地确定如何正确地编写它,使其尽可能快地执行.(看到代码它显然是*按位*上下文,而不是算术 - 它将两个字节组合成一个字). (3认同)
  • 但这可能是它在音频代码中使用的原因.所以 - 我的希望是帮助他不仅要了解它的作用,还要了解可能的用意. (2认同)

mle*_*rle 6

这是一个左移位操作,非常常见的编程习惯:http://en.wikipedia.org/wiki/Arithmetic_shift