原码
十进制数据的二进制表现形式就是原码,原码最左边的一个数字就是符号位,0为正,1为负。
例如:0 1 1 1 1 1 1 1 (+127),1 1 1 1 1 1 1 1 (-127)
反码
正数的反码是其本身(等于原码),负数的反码是符号位保持不变,其余位取反。
例如:
十进制数字 | 原码 | 反码 |
-1 | 1000 0001 | 1111 1110 |
补码
正数的补码是其本身,负数的补码等于其反码 +1。因为反码不能解决负数跨零(类似于 -6 + 7)的问题,所以补码出现了。
例如:
十进制数字 | 原码 | 反码 | 补码 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
补码的运算也适用于逻辑运算符
十进制数字 | 原码 | 反码 | 补码 |
+0 | 0000 0000 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 | 0000 0000 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
-2 | 1000 0010 | 1111 1101 | 1111 1110 |
-3 | 1000 0011 | 1111 1100 | 1111 1101 |
-4 | 1000 0100 | 1111 1011 | 1111 1100 |
-5 | 1000 0101 | 1111 1010 | 1111 1011 |
-6 | 1000 0110 | 1111 1001 | 1111 1010 |
-7 | 1000 0111 | 1111 1000 | 1111 1001 |
… | … | … | … |
-127 | 1111 1111 | 1000 0000 | 1000 0001 |
-128 | 无 | 无 | 1000 0000 |
位运算
//当&两侧是int时,要先把运算符两侧的数转化为二进制数再进行运算
//12 转为二进制 0000 1100
//5 转为二进制 0000 0101
// 1为真,0为假,按逻辑,只有前后都为真,结果才为真 也就是只有在 1&1 时,结果才为1 ,其他情况结果都是0
//所以返回结果是0000 0100,转为10进制数就是4
System.out.println(12 & 5);//4
运算符 | 含义 | 运算规则 |
& | 逻辑与 | 0为false,1为true,当都为1时才为true |
| | 逻辑或 | 0为false,1为true,当有至少一个为1时为true,如果都没有则为false |
<< | 左移 | 向左移动,低位补零 |
>> | 右移 | 向右移动,高位补零,符号位按照原来数字的符号位不变 |
>>> | 无符号右移 | 向右移动,高位补零 |