移位运算符

移位运算符(<<、>>、>>>)

  • 左移运算符(<<)
    • 正数
    • 负数
  • 右移运算符(>>)
    • 正数
    • 负数
  • 无符号右移运算符(>>>)
    • 正数
    • 负数

左移运算符(<<)

按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补0。

正数

例:12 << 2
1、首先转化为二进制,12的二进制为0000 1100
2、将二进制数向左移两位,低位补0,得到0011 0000
3、最后将二进制数转化成十进制数,0011 0000转化为十进制为48
所以,12 << 2 = 48

负数

负数的移位运算相对于正数来说就有些难度了,难度在哪里呢?
当然是负数的二进制表示十进制的转化1

例:-12 << 2
1、首先转化为二进制,-12的二进制为1111 0100
2、将二进制数向左移两位,低位补0,得到1101 0000
3、最后将二进制数转化成十进制数,1101 0000转化为十进制为-48
所以,-12 << 2 = -48

右移运算符(>>)

按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位即正数补0,负数补1

正数

例:20 >> 2
1、首先转化为二进制,20的二进制为0001 0100
2、将二进制数向右移两位,高位补符号位(0),得到0000 0101
3、最后将二进制数转化成十进制数,0000 0101转化为十进制为5
所以,20 >> 2 = 5

负数

例:-20 >> 2
1、首先转化为二进制,20的二进制为1110 1100
2、将二进制数向右移两位,高位补符号位(1),得到1111 1011
3、最后将二进制数转化成十进制数,1111 1011转化为十进制为-5
所以,-20 >> 2 = -5

无符号右移运算符(>>>)

按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补零对于正数来说和带符号右移(>>) 相同,但是对于负数来说不同

正数

例:15 >>> 2
1、首先转化为二进制,15的二进制为0000 1111
2、将二进制数向右移两位,高位补0,得到0000 0011
3、最后将二进制数转化成十进制数,0000 0011转化为十进制为3
所以,15 >>> 2 = 3

负数

因为负数的符号位(最高位)为1,而无符号右移要在最高位补0,所以32位二进制要写全。带符号右移(>>),高位是补的符号位,前24位都是1(例子中的数比较小,8位足以表示;若是数字很大,要16位才能表示的话,那就是前16位都是1),省略掉不影响计算;但这种情况比较特殊,补位和符号位不一样。

例:-15 >>> 2
1、首先转化为二进制,-15的二进制为1111 1111 1111 1111 1111 1111 1111 0001
2、将二进制数向右移两位,高位补0,得到0011 1111 1111 1111 1111 1111 1111 1100
3、最后将二进制数转化成十进制数,0011 1111 1111 1111 1111 1111 1111 1100转化为十进
制为1073741820
所以,-15 >>> 2 = 1073741820

若有说的不对的地方,或是更好的方法,欢迎留言指教,共同学习


  1. 负数的二进制表示及十进制的转化 ↩︎

你可能感兴趣的:(Java,随笔,移位运算符,左移,右移,无符号右移)