移位运算符(详细介绍)

移位运算符

左移(<<)

正数:按二进制形式,把所有数字向左移动对应位数,高位移除,低位空位补0

      例如12<<2=48

  1. 12对应二进制0000 1100
  2. 左移两位变成0011 0000
  3. 转换成十进制2^4+2^5=16+32=48

负数:例如-12<<2=-48

  1. 12对应二进制0000 1100,则-12对应的原码为1000 1100
  2. 原码——>反码,符号位不变,其余取反,变成1111 0011
  3. 反码——>补码,反码加1,则变成1111 0100
  4. 所以-12对应的二进制是1111 0100(补码)
  5. 左移两位,低位补0,变成1101 0000
  6. 补码——>反码,对应补码减一,变成1100 1111
  7. 反码——>原码,符号位不变,其余取反1011 0000
  8. 将二进制转换成十进制,2^4+2^5=16+32=48,最高位是1,则为-48

移位运算符(详细介绍)_第1张图片

  1. 第①处的0不够减,向②处借“1”当“2”,2-1=1
  2. 因为第②处的0被借了“1”,则表示“-1”,但②处本身没有,又向③处借“1”当“2”,2-1=1
  3. 因为第③处的0被借了“1”,则表示“-1”,但不够,又向④处借“1”当“2”,2-1=1
  4. 第④处的0被借了“1”,则表示“-1”,但不够,又向⑤处借“1”当“2”,2-1=1
  5. 第⑤处的1被借了,则1-1=0

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

    

   正数:20>>2=5

  1. 将20转换成二进制为0001 0100
  2. 右移两位变成0000 0101
  3. 将二进制转换为十进制2^0+2^2=5

   负数:-20>>2=-5

  1. 20对应二进制0001 0100,-20则对应的原码为1001 0100
  2. 原码——>反码,符号位不变,其余取反,变成1110 1011
  3. 反码——>补码,反码加1,则变成1110 1100
  4. 所以-20对应的二进制是1110 1100(补码)
  5. 右移两位,高位补1,变成1111 1011
  6. 补码——>反码,对应补码减一,变成1111 1010

  1. 反码——>原码,符号位不变,其余取反1000 0101
  2. 将二进制转换成十进制,,最高位是1,则为2^0+2^2=5,最高位为1,则为-5

无符号运算符(>>>)

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

 正数:15>>>2=3

  1. 转换成二进制0000 1111
  2. 右移两位,高位补0,变成0000 0011
  3. 将二进制转换成十进制,变成2^0+2^1=3

 负数:-15>>>2

  1. 15转换成二进制0000 0000 0000 0000 00000 0000 0000 1111,

-15对应原码1000 0000 0000 0000 00000 0000 0000 1111

  1. 原码——>反码,符号位不变,其余取反,1111 1111 1111 1111 1111 1111 1111 0000
  2. 反码——>补码,反码加1,变成1111 1111 1111 1111 1111 1111 1111 0001
  3. 所以-15的二进制是1111 1111 1111 1111 1111 1111 1111 0001(补码)
  4. 右移两位,高位补0,变成0011 1111 1111 1111 1111 1111 1111 1100
  5. 补码——>反码,补码减1,0011 1111 1111 1111 1111 1111 1111 1011
  6. 反码——>原码,符号位不变,其余取反,变成

0100 0000 0000 0000 00000 0000 0000 0100

  1. 将二进制转换成十进制,2^2+2^30=1073741828

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

你可能感兴趣的:(c语言,c++)