在 Java7 中,引入了二进制字面量的表示方法。可以使用前缀来表示二进制数字。例如:
package com.hxstrive.jdk7.base; /** * 二进制数字表示 * @author hxstrive.com */ public class BinaryDemo1 { public static void main(String[] args) { // 0b开头表示二进制数字,使用二进制形式给变量赋值 byte a = 0b00001010; System.out.println("a = " + a); // 表示十进制的10 int b = 0B1010; System.out.println("b = " + b); // 使用二进制数字表示,更直观的查看位逻辑运算 byte b1 = 0b00001010; byte b2 = 0b00100010; // 00000010 System.out.println("b1 & b2 = " + (b1 & b2)); } }
下面例子将演示如何通过二进制字面量来模拟 Linux 中文件目录权限“读/写/执行”,使用三个bit位来表示这些权限,其中:
100 表示读权限
010 表示写权限
001 表示执行权限
package com.hxstrive.jdk7.base; /** * 二进制数字表示 * @author hxstrive.com */ public class BinaryDemo2 { public static void main(String[] args) { auth((byte)4); // 拥有读权限 auth((byte)7); // 拥有读写执行权限 auth((byte)9); // 权限非法,权限取值范围 [0,7] auth2((byte)4); // 拥有读权限 auth2((byte)7); // 拥有读写执行权限 auth2((byte)9); // 权限非法,权限取值范围 [0,7] } private static void auth(byte auth) { // 权限定义:rwx 读写执行 switch (auth) { case 0: // 000 System.out.println("无权限");break; case 4: // 100 System.out.println("拥有读权限");break; case 2: // 010 System.out.println("拥有写权限");break; case 1: // 001 System.out.println("拥有执行权限");break; case 6: // 110 System.out.println("拥有读写权限");break; case 5: // 101 System.out.println("拥有读执行权限");break; case 7: // 111 System.out.println("拥有读写执行权限");break; case 3: // 011 System.out.println("拥有写执行权限");break; default: System.out.println("权限非法,权限取值范围 [0,7]"); } } private static void auth2(byte auth) { // 权限定义:rwx 读写执行 switch (auth) { case 0B000: System.out.println("无权限");break; case 0B100: System.out.println("拥有读权限");break; case 0B010: System.out.println("拥有写权限");break; case 0B001: System.out.println("拥有执行权限");break; case 0B110: System.out.println("拥有读写权限");break; case 0B101: System.out.println("拥有读执行权限");break; case 0B111: System.out.println("拥有读写执行权限");break; case 0B011: System.out.println("拥有写执行权限");break; default: System.out.println("权限非法,权限取值范围 [0,7]"); } } }
在 Java7 之前,我们使用数字或者十六进制表示二进制,如:0x05 或者十进制 5 均表示 0101。在进行二进制计算时,看上去不是很直观,需要我们将他们手动转换成二进制,再来理解其计算(见 auth() 方法)。但是,在 Java7 中,完全不用这么麻烦了,我们可以直接使用 0b0101 类似的方式直接表示二进制,对其进行位计算更直观了(见 auth2() 方法)。