Java中的移位运算

概要

当原码为正数的时候,正数的原码反码补码都相同,即00011的反码也为00011,补码也为00011.当原码为负数的时候,反码即按位取反(最高位符号位除外)),补码为反码加一,计算机存储的都是补码,最高位表示为符号位,1表示为负数,0表示为正数。

<<表示左移运算符

左移不区分有符号和无符号, 都是左移之后右边补上0, 最左边的符号位也直接移走。

10<<2的过程
0000 0000 0000 0000 0000 0000 0000 1010--原码
0000 0000 0000 0000 0000 0000 0000 1010--反码
0000 0000 0000 0000 0000 0000 0000 1010--补码
0000 0000 0000 0000 0000 0000 0010 1000--有符号左移2位,由于最高位为0,表示为正数,右边补0,去掉左边多余的,所以原码和补码反码都是相同的
0000 0000 0000 0000 0000 0000 0010 1000--反码
0000 0000 0000 0000 0000 0000 0010 1000--原码
-10<<2的过程
1000 0000 0000 0000 0000 0000 0000 1010--原码
1111 1111 1111 1111 1111 1111 1111 0101--反码
1111 1111 1111 1111 1111 1111 1111 0110--补码
1111 1111 1111 1111 1111 1111 1101 1000--有符号左移2位,由于最高位为1,表示为负数,去掉左边多余的,右边补0
1111 1111 1111 1111 1111 1111 1101 0111--反码
1000 0000 0000 0000 0000 0000 0010 1000--原码

二进制演算:
左移运算符的运算规律:将左边的数按照右边的数往左移动几位

>>表示有符号右移运算符

有符号右移: 右移之后, 左边的补上符号位, 正数补0, 负数补1

10>>2的过程
0000 0000 0000 0000 0000 0000 0000 1010--原码
0000 0000 0000 0000 0000 0000 0000 1010--反码
0000 0000 0000 0000 0000 0000 0000 1010--补码
0000 0000 0000 0000 0000 0000 0000 0010--有符号右移2位,由于是正数数最高位补0,去掉右边多余的10
0000 0000 0000 0000 0000 0000 0000 0010--反码
0000 0000 0000 0000 0000 0000 0000 0010--原码
-10>>2的过程
1000 0000 0000 0000 0000 0000 0000 1010--原码
1111 1111 1111 1111 1111 1111 1111 0101--反码
1111 1111 1111 1111 1111 1111 1111 0110--补码
1111 1111 1111 1111 1111 1111 1111 1101--有符号右移2位,由于是负数最高位补1,去掉右边多余的10,由于最高位为1,表示为负数,需要求原码
1111 1111 1111 1111 1111 1111 1111 1100--反码
1000 0000 0000 0000 0000 0000 0000 0011--原码

右移运算符运算规律:将左边的数按照右边的数右移几位

>>>无符号右移

无符号右移: 右移之后, 无论该数是正数还是负数, 右移之后左边都是补上0

10>>>2的过程
0000 0000 0000 0000 0000 0000 0000 1010--原码
0000 0000 0000 0000 0000 0000 0000 1010--反码
0000 0000 0000 0000 0000 0000 0000 1010--补码
0000 0000 0000 0000 0000 0000 0000 0010--有符号右移2位,由于是正数数最高位补0,去掉右边多余的10
0000 0000 0000 0000 0000 0000 0000 0010--反码
0000 0000 0000 0000 0000 0000 0000 0010--原码
-10>>>2的过程
1000 0000 0000 0000 0000 0000 0000 1010--原码
1111 1111 1111 1111 1111 1111 1111 0101--反码
1111 1111 1111 1111 1111 1111 1111 0110--补码
0011 1111 1111 1111 1111 1111 1111 1101--无符号右移2位,最高位补0,由于最高位为0,表示为正数,所以原码和补码反码都是相同的
0011 1111 1111 1111 1111 1111 1111 1101--反码
0011 1111 1111 1111 1111 1111 1111 1101--原码

<<<没有无符号左移的原因

因为左移是在后面补0,而右移是在前面边补1或0
,有无符号是取决于数的前面的第一位是0还是1
所以右移是会产生到底补1还是0的问题。
而左移始终是在右边补,不会产生符号问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值