Bootstrap

原码,补码,反码。左移、右移、无符号右移,异或运算^、或运算|

5的原码(5的二进制):00000101

反码(取反,0变1,1变0):11111010

补码(在反码的基础上末位加1):11111011

5对应的补码:11111011

-5的原码是(位首是符号位1,表示负数):10000101

-5对应的补码(末尾减1然后取反得到对应的反码,符号位不变);11111011

 

高位0表示正数,高位1表示为负数

 

左移<<

a=5,a<<2=20

5的二进制:00000101,整体左移两位,低位补0,得二进制00010100。不溢出的情况下(int 32位,左移过多可能导致高位溢出)左移n位

移动后结果等于a*2的n次方

a=-5,a<<1=-10

-5的二进制原码:10000101,对应的补码(原码减1取反):11111011,整体左移1位,低位补0,得二进制补码11110110。

通过补码11110110取反然后末尾加1换算成原码:10001010。所有-5左移1位等于-10

移动后结果=a*2的n次方

 

右移>>

a=5,a>>2=1

5的二进制:00000101,整体右移两位,高位补0,得二进制00000001。

移动后结果等于a/2的n次方。

a=-5,a>>1=-3

-5的二进制原码:10000101,对应的补码(原码减1取反):11111011,整体右移1位,高位补1(负数右移高位补1),得二进制补码11111101。

通过补码11111101取反然后末尾加1换算成原码:10000011。所有-5右移两位等于-3

移动后结果等于(a/2的n次方)—1。

 

正数右移高位补0,负数右移高位补1

无符号右移>>>

不管是正数还是负数,右移后高位都补0。

 

异或运算"^":两个运算符相同则是0,不相同则是1

或运算"|":两个运算符只要有一个为1则结果为1

按位与"&":两个运算符都为1则是1,有一个不为1则是0

 

;