跳到主要内容
版本:release

移位运算表达式

语法

形式语法
1表达式 << 表达式
2表达式 >> 表达式

左移(<<

  • 如果左操作数是 int

    右操作数也需要是 int,左移运算符 << 将左操作数整数值的二进制表示向左移动指定的位数, 右侧用0填充。

    3 << 2 ==> 0b000011 << 2 ==> 0b001100 ==> 12

  • 如果左操作数不是 int

    此时进行的不再是移位操作,具体的操作取决于左操作数的类型:

    左表达式类型右表达式类型结果类型描述
    arrayarrayarray将右侧 array 中的元素逐个添加到左侧 array 中,返回左侧 array
    mapmapmap将右侧 map 中的键值对逐个添加到左侧的 map 中,覆盖之前存在的键值对,返回左侧 map
    bufferint, float, string, bufferbuffer返回左侧 buffer; 如果右值的类型是:
    int: 取值范围应该是 -128 到 255(包含两端), 视为一个字节,添加到 buffer 末尾
    float: 按照底层储存浮点数的方式,按照主机字节序将浮点数逐字节地写入 buffer 末尾
    string: 将字符串中的内容逐字节地写入 buffer 末尾
    buffer: 将右侧 buffer 中的内容逐字节地写入左侧 buffer
    array a = [1, 2];
    array b = [3, 4];
    a << b; // a 现在是 [1, 2, 3, 4]

    map m1 = {"a": 1, "b": 2};
    map m2 = {"b": 3, "c": 4};
    m1 << m2; // m1 现在是 {"a": 1, "b": 3, "c": 4}

    buffer buf = buffer(0);
    buf << 65; // buf 现在包含一个字节,值为 65 (0x41)
    buf << 3.14; // buf 现在包含 9 个字节,
    // 前 1 个字节是 65 (0x41),后 8 个字节
    // 是浮点数 3.14 的二进制表示
    buf << "Hi"; // buf 现在包含 11 个字节

右移(>>

右移操作的两个操作数都必须是 int

右移运算符 >> 将左操作数整数值的二进制表示向右移动指定的位数,左侧用符号位(即左操作数的 最高位)填充。

12 >> 2 ==> 0b001100 >> 2 ==> 0b000011 ==> 3


需要注意,当参与移位运算时,右操作数的取值范围是 0 - 64(包含两端),超出此范围的行为受制于硬件平台的实现 并无绝对保证。

示例

int a = 12; // 二进制表示为 0b001100
int b = 2;
int c = a << b; // c 的值为 48,二进制表示为 0b110000
int d = a >> b; // d 的值为 3,二进制表示
// 为 0b000011