java 移位运算符不外乎就这三种:<<(左移),>>(带符号右移)和>>>(无符号右移).
1, 左移运算符
左移运算符<<使指定值的所有位都左移规定的次数.
1)它的通用格式如下所示:
value <<num
num 指定要移位值 value 移动的位数.
左移的规则只记住一点: 丢弃最高位(符号位同样丢弃),0 补最低位
如果移动的位数超过了该类型的最大位数, 那么编译器会对移动的位数取模. 如对 int 型移动 33 位, 实际上只移动了 332=1 位.
2)运算规则
按二进制形式把所有的数字向左移动对应的位数, 高位移出(舍弃), 低位的空位补零.
当左移的运算数是 int 类型时, 每移动 1 位它的第 31 位就要被移出并且丢弃;
当左移的运算数是 long 类型时, 每移动 1 位它的第 63 位就要被移出并且丢弃.
当左移的运算数是 byte 和 short 类型时, 将自动把这些类型扩大为 int 型.
3)数学意义
在数字没有溢出的前提下, 对于正数和负数, 左移一位都相当于乘以 2 的 1 次方, 左移 n 位就相当于乘以 2 的 n 次方
4)计算过程:
例如: 3 <<2(3 为 int 型)
把 3 转换为二进制数字 0000 0000 0000 0000 0000 0000 0000 0011,
把该数字高位 (左侧) 的两个零移出, 其他的数字都朝左平移 2 位
在低位 (右侧) 的两个空位补零. 则得到的最终结果是 0000 0000 0000 0000 0000 0000 0000 1100, 转换为十进制是 12.
移动的位数超过了该类型的最大位数,
如果移进高阶位(31 或 63 位), 那么该值将变为负值.
2, 右移运算符
右移运算符<<使指定值的所有位都右移规定的次数.
1)它的通用格式如下所示:
value>> num
num 指定要移位值 value 移动的位数.
右移的规则只记住一点: 符号位不变, 左边补上符号位
2)运算规则:
按二进制形式把所有的数字向右移动对应的位数, 低位移出(舍弃), 高位的空位补符号位, 即正数补零, 负数补 1
当右移的运算数是 byte 和 short 类型时, 将自动把这些类型扩大为 int 型.
例如, 如果要移走的值为负数, 每一次右移都在左边补 1, 如果要移走的值为正数, 每一次右移都在左边补 0, 这叫做符号位扩展(保留符号位)(sign extension ), 在进行右移
操作时用来保持负数的符号.
3)数学意义
右移一位相当于除 2, 右移 n 位相当于除以 2 的 n 次方.
4)计算过程
11>>2(11 为 int 型)
1)11 的二进制形式为: 0000 0000 0000 0000 0000 0000 0000 1011
2)把低位的最后两个数字移出, 因为该数字是正数, 所以在高位补零.
3)最终结果是 0000 0000 0000 0000 0000 0000 0000 0010.
转换为十进制是 3.
35>> 2(35 为 int 型)
35 转换为二进制: 0000 0000 0000 0000 0000 0000 0010 0011
把低位的最后两个数字移出: 0000 0000 0000 0000 0000 0000 0000 1000
转换为十进制: 8
3, 无符号右移
无符号右移运算符>>>
它的通用格式如下所示:
value>>> num
num 指定要移位值 value 移动的位数.
无符号右移的规则只记住一点: 忽略了符号位扩展, 0 补最高位
无符号右移运算符>>> 只是对 32 位和 64 位的值有意义
java 位移运算符<<,>>,>>>
来源: http://www.bubuko.com/infodetail-2559223.html