原码,反码,补码

按位与

//计算机在运算的时候,都是按照补码方式运算的,所以要得到2的补码;
一,先得到2的补码
//(1)先得到2的源码:                            00000000 00000000 00000000 00000010
二,得到2的补码
//(2)因为2是正数,由于正数是三码合一,所以源码,和补码相同
//(3)所以2的补码;                              00000000 00000000 00000000 00000010

三.得到3的补码
//(4)得到3的源码:                              00000000 00000000 00000000 00000110
四,得到3的补码
//(5)因为3是正数,由于正数是三码合一,所以源码,和补码相同
//(6)3的补码:                                  00000000 00000000 00000000 00000110
五,按位与&
//(7)2的补码和3的补码按位 &, 位全是1结果才是1
// (8)2的补码:  00000000 00000000 00000000 00000010
// (9)3的补码:  00000000 00000000 00000000 00000110
//(10)按位&     00000000 00000000 00000000 00000010 得到了补码

六.把2&3按位与的结果转为源码
// 计算结果要看源码,所以把上面计算完的补码转为源码,由于正数是三码合一,所以源码,和补码相同
// 所以源码不变是:00000000 00000000 00000000 00000010 = 2
        System.out.println(2&3);
    }
}

负数按位取反

public class BitOpenator01  {
    public static void main(String[] args) {

        //一.先得到-2的源码:                                10000000 00000000 00000000 00000010
        //二.得到补码
        // (1)计算的时候是按照补码计算的,所以要的到补码
        // (2)由于-2是负数,要想得到-2的补码,要先得到-2的反码;通过反码+1得到补码
        // (3)获取正数补码:
                // <1>正数的反码=正数的原码符号位不变,其他位取反
                // <2>正数的补码=正数的反码+1
        // (4)-2的反码计算: -2的原码符号位不变,其他位取反       11111111 11111111 11111111 11111101
        // (5)-2的补码计算: 反码+1                          11111111 11111111 11111111 11111110
        // (6) -2的补码是:                                 11111111 11111111 11111111 11111110
        //三.~-2操作:
        // (7) -2是负数,负数按位取反, 0变1,1变0
        // (8) ~-2按位取反后的结果是补码:                    00000000 00000000 00000000 00000001
        // 四.原码的计算
        // (8) 转换完的结果是正数,原码,反码,补码相同           00000000 00000000 00000000 00000001 = 1
        System.out.println(~-2);  //1
    }
}

正数按位取反

public class BitOpenator01  {
    public static void main(String[] args) {
        //一.先得到2的源码:                                   00000000 00000000 00000000 00000010
        //二.得到补码
        // (1)计算的时候是按照补码计算的,所以要的到补码,由于2是正数,补码,原码,反码相同
        // (2)原码是:                                        00000000 00000000 00000000 00000010
        //三.~2按位取反
        // (3)得到取反运算后的补码                             11111111 11111111 11111111 11111101
        // (4)结果是一个负数,因为结果是负数,不是三码和合一,想看结果要转成原码
        // 四.原码的计算
        // (5)负数转原码
        //          <1>负数的反码=负数的补码-1
        //          <2>负数原码=负数反码,符号位不变,其他位取反
        // (6)反码的计算=负数的补码-1                          11111111 11111111 11111111 11111100
        // (7)原码的计算=负数反码,符号位不变,其他位取反           10000000 00000000 00000000 00000011 = -3
        System.out.println(~2);
    }
}
原文地址:https://www.cnblogs.com/john5yang/p/15700582.html