1. 位运算
符号 | 描述 | 运算规则 |
---|---|---|
& | 与 | 两个位都为1时,结果才为1 |
| | 或 | 两个位都为0时,结果才为0 |
^ | 异或 | 两个位相同为0,相异为1 |
~ | 取反 | 0变1,1变0 |
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 |
>> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移),Java中为算术右移根据符合位来补(如为负数则补1,正数补0) |
>>> | 逻辑右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数 |
2. 原码
原码就是符号位加上真值 以下以8位来实例
+1的原码为
0000 0001
-1的原码为
1000 0001
3. 反码
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
+1的反码为
0000 0001
-1的反码为
1111 1110
4. 补码
通常一个数的二进制是以补码的形式展现
- 正数的补码就是其本身
- 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
+1的补码为
0000 0001
-1的补码为
1111 1111
5. 负数的最小值取负为多少
即负数的最小值 取反 再+1
public static void main(String[] args) {
int c = Integer.MIN_VALUE;
int d = -c;
int e = ~c + 1;
System.out.println(c); //-2147483648
System.out.println(d); //-2147483648
System.out.println(e); //-2147483648
c = 0;
d = -c;
e = ~c + 1;
System.out.println(c); //0
System.out.println(d); //0
System.out.println(e); //0
}
6. 打印二进制
public static void print(int num) {
for (int i = 31; i >=0; i--) {
//把1左移n位 和原数做与运算 两者为1时输出1否则输出
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
System.out.println();
}