原码反码补码和位运算符
原码反码补码总结
- 二进制的最高位是符号位:0表示正数,1表示负数(0 -> 0 , 1-> -)
- 正数的原码,反码,补码都是一样的(三码合一)
- 负数的反码 = 它的原码符号位不变,其它位取反(0->1,1->0)
- 负数的补码 = 它的反码 + 1,负数的反码 = 负数的补码 - 1
- 0的反码,补码都是0
- java没有符号数,换言之,java中的数都是有符号的
- 在计算机运算的时候,都是
以补码的方式来运算
的 当我们看运算结果的时候,要看它的原码
位运算符
名称 | 解释 |
---|---|
按位与& | 两个全为1,结果为1,否则为0 |
按位或| | 两位有一个为1,结果为1,否则为0 |
按位异或^ | 两位一个为0,一个为1,结果为1,否则为0 |
按位取反~ | 0 -> 1 , 1->0 |
算术右移 >> | 低位溢出,符号位不变,并用符号位补溢出的高位 |
算术左移 << | 符号位不变,低位补0 |
逻辑右移也叫无符号右移 >>> | 低位溢出,高位补 0 |
位运算符计算示例
java
int a=1>>2; //1 => 00000001 => 00000000 本质 1 / 2 / 2 =0
int c=1<<2; //1 => 00000001 => 00000100 本质 1 * 2 * 2 = 4
// 计算 2&3 (计算机计算都是以补码进行计算,计算后再转为原码查看结果)
// 1、先得到2的补码 => 2的原码(2是int类型4个字节)(正数原码补码反码三码合一)
// 原码:00000000 00000000 00000000 00000010
// 补码:00000000 00000000 00000000 00000010
// 2、先得到3的补码 => 3的原码(3是int类型4个字节)(正数原码补码反码三码合一)
// 原码:00000000 00000000 00000000 00000011
// 补码:00000000 00000000 00000000 00000011
// 3、按位与& :两个全为1结果为1,否则为0
// 2的补码:00000000 00000000 00000000 00000010
// 3的补码:00000000 00000000 00000000 00000011
// 结果补码:00000000 00000000 00000000 00000010
// 转为原码:00000000 00000000 00000000 00000010
// 二进制转十进制:2(最后的结果)
// 计算 ~-2
// 1、先得到-2的补码 => -2的原码(负数的反码 = 原码符号位不变其他位取反,负数补码 = 负数反码 + 1)
// -2的原码:10000000 00000000 00000000 00000010
// -2的反码:11111111 11111111 11111111 11111101
// -2的补码:11111111 11111111 11111111 11111110
// 2、按位取反~
// -2的补码取反:00000000 00000000 00000000 00000001 (最高位是0,变成了正数,正数三码合1)
// 转为十进制:1
// 计算 ~2
// 1、先得到2的补码 => 2的原码(2是int类型4个字节)(正数原码补码反码三码合一)
// 原码:00000000 00000000 00000000 00000010
// 补码:00000000 00000000 00000000 00000010
// 2、按位取反~
// 2的补码取反:11111111 11111111 11111111 11111101
// 反码:11111111 11111111 11111111 11111100
// 原码:10000000 00000000 00000000 00000011 (负数的原码符号位不变,其他取反)
// 结果:-3 (十进制)