移位运算表达式
语法
| 形式 | 语法 |
|---|---|
| 1 | 表达式 << 表达式 |
| 2 | 表达式 >> 表达式 |
左移(<<)
-
如果左操作数是
int右操作数也需要是
int,左移运算符<<将左操作数整数值的二进制表示向左移动指定的位数, 右侧用0填充。3 << 2==>0b000011 << 2==>0b001100==>12 -
如果左操作数不是
int此时进行的不再是移位操作,具体的操作取决于左操作数的类型:
左表达式类型 右表达式类型 结果类型 描述 arrayarrayarray将右侧 array中的元素逐个添加到左侧array中,返回左侧arraymapmapmap将右侧 map中的键值对逐个添加到左侧的map中,覆盖之前存在的键值对,返回左侧mapbufferint,float,string,bufferbuffer返回左侧 buffer; 如果右值的类型是:
int: 取值范围应该是 -128 到 255(包含两端), 视为一个字节,添加到buffer末尾
float: 按照底层储存浮点数的方式,按照主机字节序将浮点数逐字节地写入buffer末尾
string: 将字符串中的内容逐字节地写入buffer末尾
buffer: 将右侧buffer中的内容逐字节地写入左侧bufferarray 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