C++左移和右移运算符的用法(附带实例)
C++ 中,移位运算符有两个,分别是左移运算符“<<”和右移运算符“>>”,它们都是双目运算符。
移位运算的对象只能是整型或字符型数据。例如,a<<2 表示将变量 a 的二进制位左移 2 位,b>>1 表示将变量 b 的二进制位右移 1 位。
下面以短整型数据(内存中占 2 个字节,16 位)为例,介绍左移运算和右移运算的基础知识。
当数值不存在溢出风险时,左移运算的效果相当于原数值乘以 2 的幂,如下图所示。

图 1 左移位运算(不存在溢出风险)
当需要移位的数值较大时,会发生数据溢出并被舍去。例如,操作数 41883 的二进制是 1010 0011 1001 1011,左移一位后会变成 18230,左移两位后会变成 36460,如下图所示。

图 2 41883的左移位运算
当数值不存在溢出风险时,右移位运算的效果相当于原数值除以 2 的幂,如下图所示。

图 3 右移位运算(不存在溢出风险)
同样,右移位运算有时也会发生数据溢出。例如,操作数 41883 的二进制是 1010 0011 1001 1011,右移一位变成 20941,右移两位变成 10470,运行过程如下图所示。

图 4 41883的右移位运算
【实例 2】输出十六进制的高位和低位。本实例中,定义一个长整型变量并赋值,利用位与运算和移位运算,计算这个十六进制的高 4 位和低 4 位,具体代码如下:
移位运算的对象只能是整型或字符型数据。例如,a<<2 表示将变量 a 的二进制位左移 2 位,b>>1 表示将变量 b 的二进制位右移 1 位。
下面以短整型数据(内存中占 2 个字节,16 位)为例,介绍左移运算和右移运算的基础知识。
C++左移运算
左移运算,指将一个二进制数向左移动指定位数,左边(高位端)溢出的位被丢弃,右边(低位端)的空位用 0 补充。当数值不存在溢出风险时,左移运算的效果相当于原数值乘以 2 的幂,如下图所示。

图 1 左移位运算(不存在溢出风险)
当需要移位的数值较大时,会发生数据溢出并被舍去。例如,操作数 41883 的二进制是 1010 0011 1001 1011,左移一位后会变成 18230,左移两位后会变成 36460,如下图所示。

图 2 41883的左移位运算
C++右移运算
右移运算,指将一个二进制数向右移动指定的位数,右边(低位端)溢出的位被丢弃,左边(高位端)的空位用 0 填充,或者用被移位操作数的符号位填充。运算结果和编译器有关,在使用补码的机器中,正数的符号位为 0,负数的符号位为 1。当数值不存在溢出风险时,右移位运算的效果相当于原数值除以 2 的幂,如下图所示。

图 3 右移位运算(不存在溢出风险)
同样,右移位运算有时也会发生数据溢出。例如,操作数 41883 的二进制是 1010 0011 1001 1011,右移一位变成 20941,右移两位变成 10470,运行过程如下图所示。

图 4 41883的右移位运算
C++左移和右移应用实例
【实例 1】将 0x40 左移运算。本实例中,定义一个变量并赋值 0x40(对应十进制数 64),将这个值进行左移一位运算,具体代码如下:#include <iostream> using namespace std; int main(){ int a = 0x40,b; b = a << 1; cout << b << endl; return 0; }程序运行结果如下:
128
由于位运算的速度很快,在程序中遇到表达式乘以或除以 2 的幂的情况,一般采用位运算来代替。【实例 2】输出十六进制的高位和低位。本实例中,定义一个长整型变量并赋值,利用位与运算和移位运算,计算这个十六进制的高 4 位和低 4 位,具体代码如下:
#include <iostream> using namespace std; int main() { long nWord = 0x12345678; int nBits; nBits = nWord & 0xFFFF; // 与0xFFFF位与,得到低4位 printf("low bits are 0x%x\n", nBits); nBits = (nWord & 0xFFFF0000) >> 16; // 与0xFFFF0000位与,得到高4位 printf("high bits are 0x%x\n", nBits); return 0; }程序运行结果为:
low bits are 0x5678
high bits are 0x1234