移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数。当操作的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。移位操作符能操作的数只有int类型和long类型。
<<
左移运算符
左移运算符<<
使指定值的所有位都左移规定的次数
规则:丢弃最高位,0补最低位
如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取余(取模)
如对int型移动33位,实际上只移动了33%32=1位
// 3 << 2 (3为int型)
0000 0000 0000 0000 0000 0000 0000 0011 //二进制
0000 0000 0000 0000 0000 0000 0000 1100 //左移两位
//转换为十进制是12
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方
n<<m
结果为 n*2m
>>
带符号右移
有符号右移运算符<<
将运算符左边的对象向右移动运算符右边指定的位数。使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1.
规则:符号位不变,左边补上符号位,即最高位是0,左边补齐0;最高为是1,左边补齐1
11 >> 2 (11为int型)
0000 0000 0000 0000 0000 0000 0000 1011 //右移2位,左边补0
0000 0000 0000 0000 0000 0000 0000 0010
// 转换为十进制是2
右移一位相当于除2,右移n位相当于除以2的n次方,向下取整。正负数通用
n>>m
结果为 n/2m
>>>
无符号右移
无符号右移运算>>>
将运算符左边的对象向右移动运算符右边指定的位数。采用0扩展机制,也就是说,无论值的正负,都在高位补0.
规则:忽略了符号位扩展,0补最高位
无符号右移规则和右移运算是一样的,只是填充时不管左边的数字是正是负都用0来填充,无符号右移运算只针对负数计算,因为对于正数来说这种运算没有意义
无符号右移运算符>>> 只是对32位和64位的值有意义