位元左移运算 (<<), 位元右移运算 (>>)

描述

C++ 有两个算术移位的运算子:左移位 << 与右移位 >>;该运算子的运算方式为向左或向右移动运算子左边的运算元所有位元,移动的位数由运算子右边的运算元决定。

更多的位元运算数学请参考 这里

语法


variable << number_of_bits variable >> number_of_bits

参数

variable: 任一变数 (byte, int, long)
number_of_bits: 一个小于 32 的整数

范例

    int a = 5;        // binary: 00000000000000000000000000000101
    int b = a << 3;   // binary: 00000000000000000000000000101000, 等于十进制的 40
    int c = b >> 3;   // binary: 00000000000000000000000000000101, 回到一开始的 5

当你对一个数值 x 左移位 y 个位元时 (x << y),x 中最左边的 y 个位元将会逐一移出表示范围之外而消失。

    int a = 5;        // binary: 00000000000000000000000000000101
    int b = a << 30;  // binary: 01000000000000000000000000000000 - 101 中最前面的 1 就这么消失了

如果你确定在移位后不会有位元 1 因溢位而消失,可以简单的将左移运算子视为乘以 2 的次方数,运算子右边的整数则视为次方数,2 的各个次方数如下所示:

        1 << 0 == 1         1 << 1 == 2         1 << 2 == 4         1 << 3 == 8         ...         1 << 8 == 256         1 << 9 == 512         1 << 10 == 1024         ...

当 x 右移位 y 个位元时 (x >> y),而且 x 的最高位元是 1,则运算行为会根据 x 的资料型别不同而有所改变;若 x 是 int 型别,最高位元为符号位元,基于某些典故,在此符号位元将会逐位复制到右移位后空出来的位元:

    int x = -16;     // binary: 11111111111111111111111111110000
    int y = x >> 3;  // binary: 11111111111111111111111111111110

这个行为称为符号延伸 (sign extension),这可能不会是你想要的结果,你可能会想要的是 0 从左端开始移位,所以在这种状况下你可以透过型别转换至 unsigned int 来解决这个问题:

    int x = -16;                   // binary: 11111111111111111111111111110000
    int y = (unsigned int)x >> 3;  // binary: 00011111111111111111111111111110

如果你能小心地避免掉记符号延伸的问题,那么你可以用右移位运算子 >> 去进行一个除以 2 的次方数的运算:

    int x = 1000;
    int y = x >> 3;   // 等同于 1000 / 8, y 得到 125.

语法参考主页面

本页由热血青年 LBU 译自英文版。

The text of the 86Duino reference is a modification of the Arduino reference, and is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain.