首页 > 代码库 > 逻辑运算和位运算
逻辑运算和位运算
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来补高位
逻辑运算和位运算