无符右移和带符号左移/右移

带符号右移 >>     带符号左移<<     无符号右移>>>   没有无符号左移

在计算机中,不用+-来表示正负数,用最高位是0还是1来表示正负数,0表示正,1表示负 

高位在左,低位在右,左移是乘,右移是除 

1.带符号右移  

 >>     简算:[5/(2^2)=1]

正数例如 5>>2(正数高位补0)

首先写出5的二进制--->0000 0000 0000 0000 0000 0000 0000  0101

因为是正数,所以最高位为0,右移两位就是从最高位开始补2个0(左边加两个0)

即--->0000 0000 0000 0000 0000 0000 0000 0001,化为十进制结果为1[将右边红色的01去掉,在右边补两个0]

负数例如-5>>2(负数高位补1)

首先写出-5的二进制,因为是负数所以高位为1

1000 0000 0000 0000 0000 0000 0000  0101(原码)

然后写出-5的补码:保证符号为不变,其余位置去翻加一(从右往左开始,遇到第一个1之后的所有数取反)

1111 1111 1111 1111 1111 1111 1111 1011 (补码)

右移2位: 在高位补1

1111 1111 1111 1111 1111 1111 1111 1011(补码移位后的结果)[去掉右边两个1,在高位补两个1]

根据补码写出原码才是我们所求的结果,保留符号位,然后按位取反再加一即为所求数的原码

1000 0000 0000 0000 0000 0000 0000 0100(按位取反后的结果)

1000 0000 0000 0000 0000 0000 0000 0101(再加一)

结果为:5

2.带符号左移(正数低位补0,负数低位补1)

<<  简算:[5*(2^2) = 20]

 正数例如5<<2(正数低位补0)

首先写出5的二进制--->0000 0000 0000 0000 0000 0000 0000  0101

因为是正数,所以最高位为0,移两位就是从最低位开始补2个0(右边加两个0)

即--->0000 0000 0000 0000 0000 0000 0001 0100,化为十进制结果为20[将左边红色的00去掉,在左边补两个0]

 负数例如-5>>2(负数低位补1)

首先写出-5的二进制,因为是负数所以高位为1

1000 0000 0000 0000 0000 0000 0000  0101(原码)

然后写出-5的补码:保证符号为不变,其余位置去翻加一(从右往左开始,遇到第一个1之后的所有数取反)

1111 1111 1111 1111 1111 1111 1111 1011 (补码)

左移2位: 在低位补1

1111 1111 1111 1111 1111 1111 1110 1111(补码移位后的结果)

根据补码写出原码才是我们所求的结果,保留符号位,然后按位取反再加一

1000 0000 0000 0000 0000 0000 0001 0000(取反后的结果)

1000 0000 0000 0000 0000 0000 0001 0001(再加一)

结果为:-17

3.无符号右移(不论正负高位均补0)

正数例如5>>>2

与5>>2一样,结果也为1 

负数例如-5>>>2

首先写出-5的二进制,因为是负数所以高位为1

1000 0000 0000 0000 0000 0000 0000  0101(原码)

然后写出-5的补码:保证符号为不变,其余位置去翻加一(从右往左开始,遇到第一个1之后的所有数取反)

1111 1111 1111 1111 1111 1111 1111 1011 (补码)

右移2位: 在高位补0

0011 1111 1111 1111 1111 1111 1111 1011(补码移位后的结果)[去掉右边两个1,在高位补两个0]

结果为:将0011 1111 1111 1111 1111 1111 1111 1011化为二进制

 总结:

  • 5>>2     相当于5除以两次2(或者5除以2^2),结果就为1[5>>n--->5>>2^n相当于除以2^n]
  • 5>>>2   相当于5除以两次2(或者5除以2^2),结果就为1[5>>>n--->5>>>2^n相当于除以2^n]
  • 5<<2     相当于5乘以两次2(或者乘以2^2),结果为20[5<<n--->5<<2^n相当于乘以2^n]

猜你喜欢

转载自blog.csdn.net/weixin_43224539/article/details/94323571