两个箭头的
<< >> 是有符号移位
<< 表示左移,不分正负数,低位补0;
正数:r = 20 << 2 20的二进制补码:0001 0100 向左移动两位后:0101 0000 结果:r = 80 负数:r = -20 << 2 -20 的二进制原码 :1001 0100 -20 的二进制反码 :1110 1011 -20 的二进制补码 :1110 1100 左移两位后的补码:1011 0000 反码:1010 1111 原码:1101 0000 结果:r = -80
>> 表示右移,如果该数为正,则高位补0,若为负数,则高位补1;
正数:r = 20 >> 2 20的二进制补码:0001 0100 向右移动两位后:0000 0101 结果:r = 5 负数:r = -20 >> 2 -20 的二进制原码 :1001 0100 -20 的二进制反码 :1110 1011 -20 的二进制补码 :1110 1100 右移两位后的补码:1111 1011 反码:1111 1010 原码:1000 0101 结果:r = -5
三个箭头的
>>> 是无符号移位
>>> 表示无符号右移,也叫逻辑右移,即 若该数为正,则高位补0, 若该数为负数,则右移后高位同样补0
正数: r = 20 >>> 2 的结果与 r = 20 >> 2 相同; 负数: r = -20 >>> 2 注:以下数据类型默认为int 32位 -20:源码:10000000 00000000 00000000 00010100 反码:11111111 11111111 11111111 11101011 补码:11111111 11111111 11111111 11101100 右移:00111111 11111111 11111111 11111011 结果:r = 1073741819
箭头朝哪,就是朝哪移 在数字没有溢出的前提下,对于正数和负数,
左移n位相当于乘以2的n次方。 右移n位相当于除以2的n次方。
位运算符的优先级~
的优先级最高,其次是<<、>>
和<<<、>>>
,再次是&
,然后是^
,优先级最低的是|
。