JDK 7 中的语法增强 -- (1) 二进制字面常量

JDK 7 预览版已出,当然到实际的使用还有段时间,包括 IDE 的和各大主要的应用服务器的升级,及 JDK 7 本身的稳定尚须时日,但我们还是有必须瞧瞧新版 JDK 带来了哪些语法增加。


我们没有盼到闭包,相对于 JDK 5 的语法增强,JDK 7 的动作还较小,大约 8 个,这里介绍第一个 二进制字面常量。

1)二进制字面常量 -- 任何整数类型(byte, short, int 和 long) 声明时可用二进制的形式,即 01 串,只要数字前加上 0b 或 0B 即行。
 1// 8 位字节 'byte' 的最形象展示.
 2byte aByte = (byte)0b00100001;
 3
 4// 16 位短整形 'short' 的逐位亮相.
 5short aShort = (short)0b1010000101000101;
 6
 7// 32 位整形 'int' 的原始野性.
 8int anInt1 = 0b10100001010001011010000101000101;
 9int anInt2 = 0b101;
10int anInt3 = 0B101; // 可以是大 B 也可以是小 b.
11
12// 直观的见证 64 位长整型 'long' 的无所不能了. 注意最好那个 "L" 后缀,那是必须的.
13long aLong = 0b1010000101000101101000010100010110100001010001011010000101000101L;

二进制字面常量的好处,我能深刻体会到的就是在处理网络协议时,再也不需要声明一个 int i = 24, 然后发送出去,而是在发送前看到源代码 int i = 0b11000 就能知道接受时每一位是 1 还是 0,可以对照协议规范一位一位的填。再有一点就是正负数得看首位是 1 还是 0 了,1 为负,注意,即使用加了 0b,默认也是整形,所以需要显式 (byte) 等来转型。

相比其他进制而言,二进制的字面常量让数据之间的关系更清晰. 像下面,排的整整齐,哪个位置上相同或有差异一目了然。其实这也是方便了下文要讲到的按位运算:
 1public static final int[] phases = {
 2  0b00110001,
 3  0b01100010,
 4  0b11000100,
 5  0b10001001,
 6  0b00010011,
 7  0b00100110,
 8  0b01001100,
 9  0b10011000
10}

下面那样 16 进制表示法,要进行按位运算可就得用科学型计算器了,基于 16 进制的简短,一抵四,还是常用它来表示二进制数值的:
1public static final int[] phases = {
2    0x31, 0x62, 0xC4, 0x89, 0x13, 0x26, 0x4C, 0x98
3}

二进制常量让你参照规范文档来做实现更容易,前面提到的网络协议了, 机器指令什么的, 像下面模拟了一个 8 位微处理器:
 1public State decodeInstruction(int instruction, State state) {
 2  if ((instruction & 0b11100000) == 0b00000000) {
 3    final int register = instruction & 0b00001111;
 4    switch (instruction & 0b11110000) {
 5      case 0b00000000: return state.nop();
 6      case 0b00010000: return state.copyAccumTo(register);
 7      case 0b00100000: return state.addToAccum(register);
 8      case 0b00110000: return state.subFromAccum(register);
 9      case 0b01000000: return state.multiplyAccumBy(register);
10      case 0b01010000: return state.divideAccumBy(register);
11      case 0b01100000: return state.setAccumFrom(register);
12      case 0b01110000: return state.returnFromCall();
13      default: throw new IllegalArgumentException();
14    }
15  } else {
16    final int address = instruction & 0b00011111;
17    switch (instruction & 0b11100000) {
18      case 0b00100000: return state.jumpTo(address);
19      case 0b01000000: return state.jumpIfAccumZeroTo(address);
20      case 0b01000000: return state.jumpIfAccumNonzeroTo(address);
21      case 0b01100000: return state.setAccumFromMemory(address);
22      case 0b10100000: return state.writeAccumToMemory(address);
23      case 0b11000000: return state.callTo(address);
24      default: throw new IllegalArgumentException();
25    }
26  }
27}

你可以用二进制常量来增强关系运算的可读性,列模式:
 1public static final short[] HAPPY_FACE = {
 2   (short)0b0000011111100000;
 3   (short)0b0000100000010000;
 4   (short)0b0001000000001000;
 5   (short)0b0010000000000100;
 6   (short)0b0100000000000010;
 7   (short)0b1000011001100001;
 8   (short)0b1000011001100001;
 9   (short)0b1000000000000001;
10   (short)0b1000000000000001;
11   (short)0b1001000000001001;
12   (short)0b1000100000010001;
13   (short)0b0100011111100010;
14   (short)0b0010000000000100;
15   (short)0b0001000000001000;
16   (short)0b0000100000010000;
17   (short)0b0000011111100000;
18}

详情可见原文:http://download.java.net/jdk7/docs/technotes/guides/language/enhancements.html 永久链接 https://yanbin.blog/jdk-7-enhance-binary-literals/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。