java 二进制(原码、反码、补码)相关计算

二进制相关概念及测试用例,都在AppTest测试类中做详细的注释(部分摘抄与网络)了,读者可以运行其代码看效果。

1.AppTest测试类原码如下:
/**
 * java 二进制计算:
 *
 * 重要的要知道:
 *   二进制数在内存中的存放形式,二进制数在内存中是以补码的形式存放的。
 *   另外正数和负数的补码不一样,正数的补码、反码都是其本身,负数的反码是符号位不变,其余位取反,补码是反码加1
 */
public class AppTest 
{
    /**
    * 备注:按位与(&)运算:两位全为1,结果为1,否则为0.
    *
     * 用途:
     *  1)与0相与可清零。
     *
     *  2)与1相与可保留原值,可从一个数中取某些位。
     *  例如需要取10101110中的低四位,10101110 & 00001111 = 00001110,即得到所需结果。
    */
    @Test
    public void test01()
    {
        /**
         *  1 & 1 结果为:1
         *  1 & 0 结果为:0
         *  0 & 0 结果为:0
         */
        System.out.println("1 & 1 结果为:"+(1&1));
        System.out.println("1 & 0 结果为:"+(1&0));
        System.out.println("0 & 0 结果为:"+(0&0));
    }

    /**
    * 备注: 按位或(|)运算:两位只要有一位为1,否则为0.
    *
    * 用途:
     * 1)与0相或可保留原值。
     *
     * 2)与1相或可将对应位置1。例如,将X=10100000的低四位置1,使X | 00001111 = 10101111即可。
    */
    @Test
    public void test02()
    {
        /**
         *  1 | 1 结果为:1
         *  1 | 0 结果为:1
         *  0 | 0 结果为:0
         */
        System.out.println("1 | 1 结果为:"+(1 | 1));
        System.out.println("1 | 0 结果为:"+(1 | 0));
        System.out.println("0 | 0 结果为:"+(0 | 0));
    }

    /**
    * 备注:异或运算(^:两位为,即一位为1一位为0,则结果为1,否则为0.
     *
     * 用途:
     * 1)使指定位翻转:找一个数,对应X要翻转的各位为1,其余为0,使其与X进行异或运算即可。
     *     例如,X=10101110,使低四位翻转,X ^ 00001111 = 10100001     *
     * 2)与0相异或保留原值。例如X ^ 00000000 = 10101110     *
     * 3)交换两变量的值。(比借助容器法、加减法效率高)原理:一个数对同一个数连续两次进行异或运算,结果与这个数相等。
     *
     *   因此,交换方法为:A = A ^ BB = A ^ BA = A ^ B     *
    */
    @Test
    public void test03()
    {
        /**
         *  1 ^ 1 结果为:0
         *  1 ^ 0 结果为:1
         *  0 ^ 0 结果为:0
         */
        System.out.println("1 ^ 1 结果为:"+(1 ^ 1));
        System.out.println("1 ^ 0 结果为:"+(1 ^ 0));
        System.out.println("0 ^ 0 结果为:"+(0 ^ 0));
    }

    /**
    * 备注:取反(~)运算:将一个数按位取反,即 ~1 0~0 1
     *
     * 注意但是在计算存储时,存储的是补码。
    *
    */
    @Test
    public void test04()
    {
        /**
         *  ~ 1
         *  计算过程如下:
         *  原码: 0000 0001
         *  反码: 0000 0001
         *  补码: 0000 0001
         *  对补码取反:    1111 1110
         *  1取得的反码: 1111 1101
         *  反码取反:     1111 0010
         *  所以 ~1结果为-2
         *
         *  ~ -1
         *  计算过程如下:
         *  原码:  1111 0001
         *  反码: 1111 1110
         *  补码: 1111 1111
         *  对补码取反:0000 0000
         *  所以 ~-1结果为 0
         *
         *  总结:
         *  对正数取反:补码取反减1取反
         *  对负数取反:原码取反加1取反
         *
         *  规律:正数的取反等于正数加1取负  例如1的取反等于-2
         *       负数的取反等于负数加1取正   例如-1的取反等于0
         *
         * 以下程序执行结果:
         *  ~1 结果为:-2
         *  ~-1结果为:0
         */
        System.out.println("~1 结果为:"+(~1));
        System.out.println("~-1结果为:"+(~-1));
    }
     /**
     * 备注:
      *
      *   左移(<<):
      *     将一个数左移x位,即左边丢弃x位,右边用0x位。例:11100111 << 2 = 10011100      *     每左移1位,相当于该数十进制时乘一次2      *   右移(>>):
      *     将一个数右移若干位,右边舍弃,正数左边补0,负数左边补1。每右移一位,相当于除以一次2      *
      *   无符号右移(>>>):。无论是正数还是负数,高位通通补0      *    对于正数而言,>>>>>没区别。
      *    对于负数而言,-2 >>> 1,结果是2147483647Integer.MAX_VALUE),-1 >>> 1,结果是2147483647Integer.MAX_VALUE)。
      */
    @Test
    public void test05()
    {
        /**
         *  2 << 2 结果为:8
         *  16 >> 2 结果为:4
         *  -2 >>> 1 结果为:2147483647
         */
        System.out.println("2 << 2 结果为:"+(2 <<2));
        System.out.println("16 >> 2 结果为:"+(16 >> 2));
        System.out.println("-2 >>> 1 结果为:"+(-2 >>> 1));
    }

}
2.Java API 的进制转换
用途 方法
十进制转成十六进制 Integer.toHexString(int i)
十进制转成八进制 Integer.toOctalString(int i)
十进制转成二进制 Integer.toBinaryString(int i)
十六进制转成十进制 Integer.valueOf("FFFF", 16).toString()
八进制转成十进制 Integer.valueOf("2018", 8).toString()
二进制转成十进制 Integer.valueOf("1001", 2).toString()

猜你喜欢

转载自blog.csdn.net/lyitit/article/details/80839217