JDK 7 中的语法增强 -- (1) 二进制字面常量
JDK 7 预览版已出,当然到实际的使用还有段时间,包括 IDE 的和各大主要的应用服务器的升级,及 JDK 7 本身的稳定尚须时日,但我们还是有必须瞧瞧新版 JDK 带来了哪些语法增加。
我们没有盼到闭包,相对于 JDK 5 的语法增强,JDK 7 的动作还较小,大约 8 个,这里介绍第一个 二进制字面常量。
1)二进制字面常量 -- 任何整数类型(byte, short, int 和 long) 声明时可用二进制的形式,即 01 串,只要数字前加上 0b 或 0B 即行。
二进制字面常量的好处,我能深刻体会到的就是在处理网络协议时,再也不需要声明一个 int i = 24, 然后发送出去,而是在发送前看到源代码 int i = 0b11000 就能知道接受时每一位是 1 还是 0,可以对照协议规范一位一位的填。再有一点就是正负数得看首位是 1 还是 0 了,1 为负,注意,即使用加了 0b,默认也是整形,所以需要显式 (byte) 等来转型。
相比其他进制而言,二进制的字面常量让数据之间的关系更清晰. 像下面,排的整整齐,哪个位置上相同或有差异一目了然。其实这也是方便了下文要讲到的按位运算:
下面那样 16 进制表示法,要进行按位运算可就得用科学型计算器了,基于 16 进制的简短,一抵四,还是常用它来表示二进制数值的:
二进制常量让你参照规范文档来做实现更容易,前面提到的网络协议了, 机器指令什么的, 像下面模拟了一个 8 位微处理器:
你可以用二进制常量来增强关系运算的可读性,列模式:
详情可见原文: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) 进行许可。
我们没有盼到闭包,相对于 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) 进行许可。