移位运算符

左移(<<)

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

      例如12<<2=48

* 12对应二进制0000 1100
* 左移两位变成0011 0000
* 转换成十进制2^4+2^5=16+32=48
负数:例如-12<<2=-48

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

* 第①处的0不够减,向②处借“1”当“2”,2-1=1
* 因为第②处的0被借了“1”,则表示“-1”,但②处本身没有,又向③处借“1”当“2”,2-1=1
* 因为第③处的0被借了“1”,则表示“-1”,但不够,又向④处借“1”当“2”,2-1=1
* 第④处的0被借了“1”,则表示“-1”,但不够,又向⑤处借“1”当“2”,2-1=1
* 第⑤处的1被借了,则1-1=0
右移(>>):按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位正数补0,负数补1

    

   正数:20>>2=5

* 将20转换成二进制为0001 0100
* 右移两位变成0000 0101
* 将二进制转换为十进制2^0+2^2=5
   负数:-20>>2=-5

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

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

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

 正数:15>>>2=3

* 转换成二进制0000 1111
* 右移两位,高位补0,变成0000 0011
* 将二进制转换成十进制,变成2^0+2^1=3
 负数:-15>>>2

* 15转换成二进制0000 0000 0000 0000 00000 0000 0000 1111,
-15对应原码1000 0000 0000 0000 00000 0000 0000 1111

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

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

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

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信