其实不仅仅适用于java 计算机中移位都是这样处理的
左移 <<
有符号的移位操作
左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充
右移位:>>
有符号的移位操作
右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,如果是正数用0补充,负数用1补充。
【因为负数表现形式是补码 补码的左移补0 右移补1】
【正数是用原码表示的 左移右移都是补0】
尤其要注意负数的右移位 先转换成补码 移位 补1 然后转换成原码 得出真实的值
算术右移>>>
(unsigned right-shit),右移过程使用零扩展(zero extension),即最高位一律补0,也就是算术右移
背景知识:
计算机中 正数用原码表示 负数用补码表示
转载[http://indian.blog.163.com/blog/static/1088158200610942745817/]
1、原码
原码就是符号位加上真值的绝对值。简单说,就是符号位加上数的二进制表示。比如,+3(以8bit为例),符号位为0,3转化为二进制就是11,那么 +3 的原码就是00000011(不足部分补0)。同理, -3,符号位为1,3转化为二进制就是11,那么 -3 的原码就是10000011(不足部分补0)。即:
[+3] = [00000011]原
[-3] = [10000011]原
2、反码
一个负数的符号位不懂,其余位取反,就是机器数的另一种表示形式——反码。正数的反码与原码形式一样。
[+3] = [00000011]原 = [00000011]反
[-3] = [10000011]原 = [11111100]反
3、补码
负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的。
[+3] = [00000011]原 = [00000011]反 = [00000100]补
[-3] = [10000011]原 = [11111100]反 = [11111101]补