二进制相关概念及测试用例,都在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 ^ B,B = A ^ B,A = 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位,右边用0补x位。例:11100111 << 2 = 10011100。 * 每左移1位,相当于该数十进制时乘一次2。 * 右移(>>): * 将一个数右移若干位,右边舍弃,正数左边补0,负数左边补1。每右移一位,相当于除以一次2。 * * 无符号右移(>>>):。无论是正数还是负数,高位通通补0。 * 对于正数而言,>>和>>>没区别。 * 对于负数而言,-2 >>> 1,结果是2147483647(Integer.MAX_VALUE),-1 >>> 1,结果是2147483647(Integer.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() |