apollo-core中的apollo.core.utils中的相关代码及测试:
104 结果为 68
-104结果为 98
原理:
1. 104计算方法:
(1) 二进制表示为: 0110,1000
(2) 二进制计算:
0110, 1000 & 0xF = 0110, 1000 & 0000, 1111 = 0000, 1000
0110, 1000 >>4 = 0000, 0110 & 0xF = 0000, 0110 & 0000, 1111 = 0000, 0110
(3) 转十进制:
0000, 1000 => 1 * 2^3 = 8
0000, 0110 => 1 * 2^2 + 1 * 2 = 6
2. -104计算方法
(1) 二进制表示: 1110, 1000 (首位为符号位)
(2) 二进制计算
源码: 1110, 1000
反码(除符号位外取反): 1001, 0111
补码(反码+1): 1001,1000
1001,1000 & 0xF = 0000, 1000
1001,1000 >> 4 = 0000, 1001 & 0xF = 0000, 1001
(3) 转十进制:
0000, 1000 => 1 * 2^3 = 8
0000, 1001 => 1 * 2^3 + 1 = 9
3. 补充 -104 >>4 = -7
-104补码右移4位后: 0000, 1001
反向转原码: 1001反向取补, 即-1为: 1000
1000再转为原码: 1111,首位符号位: -1 * (1 * 2^2 + 1*2^1 + 1*2^0) = -1 * (4 + 2 + 1) = -7
2. -104的二进制表示为: 1110, 1000(首位为符号位)
// ByteUtilTests.java
@Test
public void testToHexString() {
System.out.println(ByteUtil.toHexString(new byte[] {(byte) 104}));
System.out.println(ByteUtil.toHexString(new byte[] {(byte) -104}));
Assert.assertEquals("", ByteUtil.toHexString(new byte[] {}));
Assert.assertEquals("98", ByteUtil.toHexString(new byte[] {(byte)-104}));
}
// ByteUtil.java
private static final char[] HEX_CHARS = new char[] {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
public static String toHexString(byte[] bytes) {
char[] chars = new char[bytes.length * 2];
int i = 0;
for (byte b : bytes) {
chars[i++] = HEX_CHARS[b >> 4 & 0xF];
chars[i++] = HEX_CHARS[b & 0xF];
}
return new String(chars);
}