代码之家  ›  专栏  ›  技术社区  ›  Kurru

在C中,运算符“<”是什么意思?

  •  32
  • Kurru  · 技术社区  · 15 年前

    我使用Naudio软件包在C中进行了一些基本的音频编程,我遇到了以下表达式,我不知道它的含义,因为我以前从未见过使用<<运算符。那么<<是什么意思?

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

    short sample = (short)((buffer[index + 1] << 8) | buffer[index + 0]);
    
    9 回复  |  直到 15 年前
        1
  •  62
  •   Community CDub    8 年前

    定义

    < Buff行情>

    左移位运算符(<<)移位 它的第一个操作数在数字后面 由其第二个指定的位 操作数。第二种类型 操作数必须是int。 lt;<operator(msdn c reference)

    < /块引用>

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

    用法

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

    另一种用法是使用 颜色位。Charles Petzold Foundations 文章”bitmaps and pixel bits“ Shows an example of<<when working with colors:(使用颜色时显示<<示例:)

    ushort pixel=(ushort)(绿色<<5蓝色);
    
    其第二
    操作数。第二种类型
    操作数必须是int。
    << Operator (MSDN C# Reference)
    alt text

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

    用法

    算术移位可以作为执行有符号整数乘或除以二次幂的有效方法。向左移动n有符号或无符号二进制数上的位具有乘以的效果。n.向右移动n2的补符号二进制数上的位具有除以的效果。n但它总是向下舍入(向负无穷大)。这与通常在有符号整数除法(取整为0)中取整的方式不同。这种差异导致多个编译器中出现错误。

    另一种用法是彩色位元. 查尔斯·佩佐德基金会article "Bitmaps And Pixel Bits"显示使用颜色时的示例<<:

    ushort pixel = (ushort)(green << 5 | blue);
    
        2
  •  8
  •   Benjamin Podszun    15 年前

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

    左移或多或少是2倍,但更快

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

        3
  •  6
  •   mletterle    15 年前

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

        4
  •  3
  •   missingfaktor Kevin Wright    15 年前

    它叫左移接线员。

    跟随 this 有关详细信息的链接。

        5
  •  2
  •   Leonardo Herrera    15 年前

    位运算符已经解释了很多次。让我们说 buffer[0] 包含 1个 , buffer[1] 包含 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
    

    而“”运算符(按位或)只需将这两个值放在一起并比较每比特的比特数。

      0000 0001 0000 0000
    | 0000 0000 0000 0010
    = 0000 0001 0000 0010
    

    最后一个值存储在“sample”变量中(在本例中为258),反向操作类似:

    buffer[0] = sample & 255;
    buffer[1] = (sample & (255 << 8)) >> 8;
    
        6
  •  1
  •   JonH    15 年前

    左移 以下是一些可以帮助您的msdn: http://msdn.microsoft.com/en-us/library/ayt2kcfb(VS.80).aspx

        7
  •  1
  •   wdh    15 年前

    “<<”是左移运算符。 X & lt; Y 移位位模式 X Y 向左定位。

    例如,如果 X 0001 0101号 Y 是1,那么结果是 0010 1010 . 就像有人把每一块都推开了。

        8
  •  1
  •   Nifle Hassan Syed    15 年前

    正如一些人已经指出的,这是一个换班操作。

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

    见本页底部 on msdn.

        9
  •  1
  •   Martin Brown    15 年前

    正如其他人所说,<<运算符将数字的位向左移动。有人在音频应用程序中这样做的正常原因是将两个8位单声道样本(一个用于左和右)组合成一个16位的Sterio样本。

    所以在样本代码中,缓冲区似乎包含了在交替样本中用左和右编码的sterio。作者将第一个左8位和第二个右8位相结合,形成一个16位的立体空间样本,其中高8位是一个信道,低8位是另一个信道。

    如果在您的示例中,缓冲区包含:

    1001 0100 (Right)
    1001 0011 (Left)
    

    您在样本中得到的结果是:

    (Left)    (Right)
    1001 0011 1001 0100