Skip to content
On this page

原码反码补码和位运算符

原码反码补码总结

  1. 二进制的最高位是符号位:0表示正数,1表示负数(0 -> 0 , 1-> -)
  2. 正数的原码,反码,补码都是一样的(三码合一)
  3. 负数的反码 = 它的原码符号位不变,其它位取反(0->1,1->0)
  4. 负数的补码 = 它的反码 + 1,负数的反码 = 负数的补码 - 1
  5. 0的反码,补码都是0
  6. java没有符号数,换言之,java中的数都是有符号的
  7. 在计算机运算的时候,都是以补码的方式来运算
  8. 当我们看运算结果的时候,要看它的原码

位运算符

名称解释
按位与&两个全为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 (十进制)