首页 > 编程笔记 > C++笔记 阅读:12

C++左移和右移运算符的用法(附带实例)

C++ 中,移位运算符有两个,分别是左移运算符“<<”和右移运算符“>>”,它们都是双目运算符。

移位运算的对象只能是整型或字符型数据。例如,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

相关文章