原码、反码、补码
- 二进制的最高位符是符号位:0表示正数,1表示负数(0->0,1->-)
- 正数的反码,补码都一样
- 负数的反码=他的原码不变,其它位取反(0->1,1->0)
- 负数的补码=他的反码+1,复数的反码=负数的补码-1
- 0的反码、补码都是0
- Java没有无符号数(Java的数都是有符号的)
- 计算机运算时都是按照补码的方式运算的
- 查看运算结果时看他的原码
Java有7个位运算符。
- &
- |
- ^
- ~
- >>
- <<
- >>>
按位与&:两位全为1,结果为1,否则为0
按位或|:两位有一位为1,结果为1,否则为0
按位异或^:两位一个为1,一个为0,结果为1,否则为0
按位取反~:0->1,1->0
常见运算符
求2&3的结果:
分析:2获得原码,2是整形占4个字节所以有四组,每一组有八个字节。即可获得以下结构。
2的补码 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
3的补码 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
2&3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
2&3第一个数是正数(三码一致),查看结果是看2&3的原码(补码)。
public class example {
public static void main(String[] args) {
System.out.println(2 & 3);
}
}
先获得-2的原码。
-2的原码 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
-2的反码 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | |
-2的补码 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
~-2操作 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
根据~-2操作得到的二进制转为十进制为1。
public class example {
public static void main(String[] args) {
System.out.println(~-2);
}
}
其他同理。
其他位运算符
- 算术右移>>:低位溢出,符号位不变,用符号位补益出的高位
- 算数左移<<:符号位不变,低位补0
- 逻辑右移(无符号右移)>>>:低位益出,高位补0
例如:int a>>2;//本质是1/2/2=0;int c=1<<2;//本质是1*2*2=4