ps:这些都是本人自己原创总结的笔记欢迎大家一起学习。
这是底层重点,下面的各级规定必须背会
二进制的最高位是符号位:0表示正数,1表示负数
正数的原码,反码和补码都一样。
负数的反码=它的原码符号位不变,其他位取反(0->1,1->0)
负数的补码=它的反码+1,负数的反码=它的补码-1
java没有无符号数,换言之java中的数都是有符号的。
在计算机运行时都是以补码的方式运行的。
当我们看它的运行结果时,要看它的原码
四个位运算符
按位与&:两位全为1,结果为1,否则为0
按位或|:两位有一位为1,结果为1,否则为0
按位异或^:一个为0,一个为1,结果为1,否则为0
按位取反~:0->1,1->0
举例
2&3=?
2的补码:
3的补码:
2&3的补码:
2&3的原码:
~-2=?
-2的反码:
-2的补码:
取反:
原码:
~2=?
2的补码:
取反:
补码转反码:
反码再变回原码:
2|3=?
2的补码:
3的补码:
或运算:
补码变反码变原码:
2^3=?
2的补码:
3的补码:
异或运算:
位运算的妙用
可直接使用 (m&1)==1?奇数:偶数 获得结果*,如:
不用临时变量交换两个整数的值:
原理:
异或0具有保持的特点,即1010^0000 = 1010;
异或1具有翻转的特点,即1010^1111 = 0101;
由此可推导:
b^(a^b) = a
a^(b^(a^b)) = b
三个位移运算符
算数右移>>:低位溢出。符号位不变,并用符号位补溢出的高位。
算数左移<<:符号位不变,低位左移补0
逻辑右移>>>:也叫无符号右移,低位溢出高位补0