reference:language:bitshift
| |
zh:reference:language:bitshift [2014/08/08 02:51] – 创建 弘毅 | reference:language:bitshift [2023/06/07 04:23] (当前版本) – 外部编辑 127.0.0.1 |
---|
| ====== bitshift left (<<), bitshift right (>>) ====== |
| |
| ===== 描述 ===== |
| |
| 在C++语言中有两个移位运算符:左移位运算符(<<)和右移运算符(>>)。这些操作符可使左运算元中的某些位移动右运算元中指定的位数。 |
| |
| 想了解有关位的更多信息可以点击 这里。 |
| ===== 语法 ===== |
| |
| variable << number_of_bits |
| variable >> number_of_bits |
| ===== 参数 ===== |
| |
| variable - (byte, int, long) number_of_bits integer <= 32 |
| ===== 例子 ===== |
| <code cpp> |
| int a = 5; // 二进制数: 0000000000000101 |
| int b = a << 3; // 二进制数: 0000000000101000, 或十进制数:40 |
| int c = b >> 3; // 二进制数: 0000000000000101, 或者说回到开始时的5 |
| </code> |
| 当你将x左移y位时(x<<y),x中最左边的y位会逐个逐个的丢失: |
| <code cpp> |
| int a = 5; // 二进制: 0000000000000101 |
| int b = a << 14; // 二进制: 0100000000000000 - 101中最左边的1被丢弃 |
| </code> |
| 如果你确定位移不会引起数据溢出,你可以简单的把左移运算当做对左运算元进行2的右运算元次方的操作。例如,要产生2的次方,可使用下面的方式: |
| <code> |
| 1 << 0 == 1 |
| 1 << 1 == 2 |
| 1 << 2 == 4 |
| 1 << 3 == 8 |
| ... |
| 1 << 8 == 256 |
| 1 << 9 == 512 |
| 10 << 1 == 1024 |
| ... |
| </code> |
| 当你将x右移y位(x>>y),如果x最高位是1,位移结果将取决于x的数据类型。如果x是int类型,最高位为符号位,确定是否x是负数或不是,正如我们上面的讨论。如果x类型为int,则最高位是符号位,正如我们以前讨论过,符号位表示x是正还是负。在这种情况下,由于深奥的历史原因,符号位被复制到较低位: |
| <code cpp> |
| X = -16; //二进制:1111111111110000 |
| Y = X >> 3 //二进制:1111111111111110 |
| </code> |
| 这种结果,被称为符号扩展,往往不是你想要的行为。你可能希望左边被移入的数是0。右移操作对无符号整型来说会有不同结果,你可以通过数据强制转换改变从左边移入的数据: |
| <code cpp> |
| X = -16; //二进制:1111111111110000 |
| int y = (unsigned int)x >> 3; // 二进制: 0001111111111110 |
| </code> |
| 如果你能小心的避免符号扩展问题,你可以将右移操作当做对数据除2运算。例如: |
| <code cpp> |
| INT = 1000; |
| Y = X >> 3; 8 1000 //1000整除8,使y=125 |
| </code> |
| |
| |
reference/language/bitshift.txt · 最后更改: 2023/06/07 04:23 由 127.0.0.1