首页 > 代码库 > 逻辑运算和位运算

逻辑运算和位运算

Java中负数的运算都是以补码的形式来进行的而且一个运算如果结果是负数,要从补码转换成它的源码得到运算结果

正数的源码、反码、补码是一样的

负数的反码是源码符号位不变,其他位取反,补码是反码加1

 

~取反操作:将所有位数全部0变1,1变0,不过如果正数取反得到的是负数,那么负数要从补码转回源码才可以,比如2的源码是00000000000000000……0010,取反之后是111111111111111……111101,这样得到的是负数,所以要从补码转回源码,先转成反码,是补码减1,得到的是11111111111…… 1111100,再转回源码,是符号位不变,其他位取反,得到的是10000000000000000……00000011,得到的是-3,所以~2=-3.

负数取反:

~(-5):1000000000000000  …… 00000101

反:  111111111111111111……111111010

补:  111111111111111111 ……11111011、

取反:0000000000000000000000000000100

得4

 

&位与:如果两个数字对应位数都为1,则结果为1,如果有至少一个为0,那么就为0.这个道理和逻辑与差不多。2&(-5),操作之前,由于-5是负数,要转换成补码再进行操作。

2:                 00000000000000000000000……00010

-5源码:            10000000000000000000000……00101

-5反码              11111111111111111111111……11010

是源码符号不变其他取反           

-5补码是反码加1     11111111111111111111111……11011

 

和2与:           00000000000000000000000……00010

结果是               00000000000000000000000……00010

所以结果是2

 

“|”位或:2|3  :

                                     00000000000000000000000000……000010

                                     00000000000000000000000000……000011

结果是3.

 

2|(-3):         0000000000000000000000000000…… 00010

 

                                     1000000000000000000000000000…… 00001(源 -1)

                                     1111111111111111111111111111…… 11110(反)

                                     1111111111111111111111111111…… 11111(与)

                                     1111111111111111111111111111…… 11101(补)

                                     1111111111111111111111111111…… 11100反

 (从下到上)              1000000000000000000000000000…… 00011源

 

算术右移:>> 低位溢出,符号位不变,并用符号位补溢出的高位

算术左移:<<符号位不变低位补0

逻辑右移:低位溢出高位补0.和算术溢出的区别就在于如果逻辑右移的符号位是1,那么仍然用0来补高位

 

逻辑运算和位运算