正数负数的二进制位运算(左移 右移 无符号右移)

正数和负数需先转换成相应的二进制,再进行移位运算.详细举例如下:
1、左移(向左移动,低位补0,没有无符号左移,因为左移不影响符号位):
(1)正数左移 2<<1

(a)2为正数,其原码反码和补码均 00000000 00000000 00000000 00000010
(b)00000000 00000000 00000000 00000010 <<1 = 00000000 00000000 00000000 00000100 = 4

(2)负数左移 -2<<1

(a)-2原码 10000000 00000000 00000000 00000010
(b)-2反码 11111111 11111111 11111111 11111101
(c)-2补码 11111111 11111111 11111111 11111110 
(d)11111111 11111111 11111111 11111110 <<1 = 11111111 11111111 11111111 11111100
(e)11111111 11111111 11111111 11111100低位减1=11111111 11111111 11111111 11111011
(f)11111111 11111111 11111111 11111011取反=10000000 00000000 00000000 00000100= -4 

2、右移(符号位先跟着向右移动完之后,最高位再还原为原符号位):
(1)正数右移 2>>1

(a)2为正数,其原码反码和补码均 00000000 00000000 00000000 00000010
(b)00000000 00000000 00000000 00000010 >>1 = 00000000 00000000 00000000 00000001 = 1

(2)负数右移 -2>>1

(a)-2原码 10000000 00000000 00000000 00000010
(b)-2反码 11111111 11111111 11111111 11111101
(c)-2补码 11111111 11111111 11111111 11111110 
(d)11111111 11111111 11111111 11111110 >>1=11111111 11111111 11111111 11111111(负数,需转换)
(e)11111111 11111111 11111111 11111111低位减1=11111111 11111111 11111111 11111110
(f)11111111 11111111 11111111 11111110取反=10000000 00000000 00000000 00000001= -1 

2、无符号右移(向右移动,高位补0,符号位也跟着移动,主要针对负数):
(1)正数无符号右移 2>>>1(由于右移不影响正数符号位,故与正数右移结果一致)
…省略,具体参考正数右移…
(2)负数无符号右移 -2>>>1

(a)-2原码 10000000 00000000 00000000 00000010
(b)-2反码 11111111 11111111 11111111 11111101
(c)-2补码 11111111 11111111 11111111 11111110 
(d)11111111 11111111 11111111 11111110 >>>1 = 01111111 11111111 11111111 11111111(正数,不需转换)
(e)01111111 11111111 11111111 11111111=2^0+2^1+2^2+...+2^30
(f)设s=2^0+2^1+2^2+...+2^30
    2s=2^1+2^1+2^2+...+2^30+2^31
   则2s-s=2^31-2^0=2^31-1=2,147,483,648 - 1 = 2,147,483,647

你可能感兴趣的:(foundation)