移位运算符:<<(左移)、>>(带符号右移)和>>>(无符号右移)

1.左移
  • 在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方
  • 左移的规则只记住一点:丢弃最高位,0补最低位
2.带符号右移
  • 正数右移一位相当于除2,右移n位相当于除以2的n次方, 负数另计算
  • 按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1
  • 1、正整数的原码、反码、补码完全一样,即符号位固定为0,数值位相同
  • 2、负整数的符号位固定为1,由原码变为补码时,规则如下:
    • 2.1原码符号位1不变,整数的每一位二进制数位求反,得到反码
    • 2.2反码符号位1不变,反码数值位最低位加1,得到补码
  • 3、补码求真值
    • 11111100为负整数=-1*(2**7)+1*(2**6)+1*(2**5)+1*(2**4)+1*(2**3)+1*(2**2)=-4
  • ref: 原码、反码、补码之间的转换和简单运算
-15>>2 = -4
数的二进制码=正数的二进制的补码=正数的二进制码的反码+1
所以-15的二进制码 = 00001111的补码 = ~(00001111)+1 = 11110000+1 = 11110001
>>运算,负数右移且符号位不移的时候,低位去掉,高位(符号位不变,符号位以后的高位)补1
>>>运算,负数右移且符号位也移的时候,低位去掉,高位(符号位前面的高位)补0
所以,-15的右移过程应该是
11110001 -> 11111100(-4)

 

3.无符号右移
  • 右移一位相当于除2,右移n位相当于除以2的n次方。
  • 无符号右移规则和右移运算是一样的,只是填充时不管左边的数字是正是负都用0来填充

ref:https://www.cnblogs.com/blog-cq/p/5793529.html

0