在C/C++中使用左移和右移运算符

时间:2020-02-23 14:30:00  来源:igfitidea点击:

在本文中,我们将研究在C/C++中使用左移和右移运算符。

如果您想进行一些位操作,这两个运算符将非常有用。

使用左移运算符(<<)

左移( &lt;&lt;)运算符称为算术左移运算符。

这适用于有符号和无符号数字。

因此,我们可以将其应用于intlongchar等类型。

此运算符将数字的位相应左移我们指定的数量。

shifted_value = old_value << amount;

例如,考虑整数100。
按位格式,我们可以将其写为1100100。

但是,我们没有写所有位。
如果我们假设整数是4个字节(32位),则完整的字节表示形式(32位)将是:

00000000000000000000000001100100

如果我们想将此数字左移2个单位,会发生什么?

该数字变为400,即:

00000000000000000000000110010000

这意味着我们将整数乘以(2 ^ amount)!

如果amount = 2,我们将100乘以2 ^ 2 = 4,那么我们的最终结果是400!

#include <stdio.h>

int main() {
  unsigned int a = 100;
  unsigned int b = a << 2; //We're NOT type casting to float
  printf("a = %d, b = %d\n", a, b);
  return 0;
}

输出

a = 100, b = 400

确实,我们能够验证左移是否可以为我们带来这个结果!

现在,让我们看一下正确的移位运算符。

使用右移运算符(>>)

这类似于左移位运算符,但将位向右移位。

其中最后被替换的位不会移到任何地方。
最初的位将替换为0。

shifted_value = old_value >> amount;

这与将" old_value"除以2 ^量相同。

考虑以下代码段:

#include <stdio.h>

int main() {
  unsigned int a = 102;
  unsigned int b = 205;

  unsigned int c = a >> 2;
  unsigned int d = b >> 3;

  printf("a = %d, c = %d\n", a, c);
  printf("b = %d, b = %d\n", b, d);
  return 0;
}

输出

a = 102, c = 25
b = 205, b = 25

在第一种情况下,我们得到c = 102 /(2 ^ 2)= 102/4 = 25(最近整数)

您可以通过写入位来验证结果!

102 = 1100100
102 >> 2 = 0011001 (25 -> Notice the leading bits are replaced with 0)

205 = 11001101
205 >> 3 = 00011001 (25)

什么时候应该使用这些运算符?

C标准要求执行算术左移和右移。

但是,这些运算符对带符号数字的行为不是由标准定义的。

这是因为当左移无符号数字时可能会发生溢出错误!

因此,每当您要使用这些运算符时,请注意以下几点:

  • 对于大多数实现,负号的左移通常是不确定的。

  • 除非您需要算术右移,否则最好仅对无符号类型进行位移,因为这样可以避免可能的溢出错误。

因此,我的建议是仅在无符号数据类型上使用它们。