Java中原码、反码、补码的的理解:

96 阅读3分钟

对于有符号的而言:

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

位运算符:

java中有7个位运算(&、|、^、~、>>、<<、>>>) 运算规则:

  • 按位与&:两位全为1,结果位1,否则位0;
  • 按位或|:两位有一位为1,结果为1,否则为0;
  • 按位异或^:两位一个为0,一个为1,结果为1,否则为0;
  • 按位取反~:0 -> 1,1 -> 0;

举例:

    // 推导过程:、
    // 1. 2的补码 => 2的原码(int 类型四个字节) => 00000000 00000000 00000000 00000010
    //    2的补码(三码合一) => 00000000 00000000 00000000 00000010
    // 2. 3的补码 => 3的原码(int 类型四个字节)=> 00000000 00000000 00000000 00000011
    //    3的补码(三码合一) => 00000000 00000000 00000000 00000011
    /*
        00000000 00000000 00000000 00000010
                        &
        00000000 00000000 00000000 00000011
      ---------------------------------------
        00000000 00000000 00000000 00000010 => 2
    */
    System.out.println(2&3);//2
    
    /*
        推导过程:
        1. 先得到-2的原码     => 00000000 00000000 00000000 00000010
        2. -2的反码(三码合一) => 11111111 11111111 11111111 11111101
        3. -2 的补码          => 11111111 11111111 11111111 11111110
        4. ~-2操作:          => 00000000 00000000 00000000 00000001
        5.运算后的原码 => 00000000 00000000 00000000 00000001 => 1
    */
    System.out.println(~-2);//1
    /*
        推导过程:
        1. 先得到2的原码     => 00000000 00000000 00000000 00000010
        2. 2的补码(三码合一) => 00000000 00000000 00000000 00000010
        3. 得到3的原码       => 00000000 00000000 00000000 00000011
        4. 3的补码(三码合一) => 00000000 00000000 00000000 00000011
        5.
            00000000 00000000 00000000 00000010
                             |
            00000000 00000000 00000000 00000011  
          ---------------------------------------
            00000000 00000000 00000000 00000011  => 3
    */
    System.out.println(2|3);//3