16进制到byte转换
- 格式:pdf
- 大小:71.74 KB
- 文档页数:1
16进制到byte转换
我们经常会看到这样的语法
(byte) 0xAD
0xAD实际是个16进制,转换成⼆进制为:10101101,转换成10进制是:173,它是个正数
10101101只是int的简写,int由4个byte字节,即32位bit组成,实际的值是
(00000000 00000000 00000000 )10101101
int由4 byte组成,因此int转byte是会掉位的,直接截取最后⼀个字节,即:
10101101
符号位是1,因此它是负数,负数的存储⽅式是补码。
因此要先求出补码才能计算值。
求补码⽅式为:
符号位不变,其他位取反,然后+1,映射到这⾥则为
11010010 + 1 -> 11010011
则值为 -(2^6+2^4+2^1+2^0) = -83
因此0xAD = 173 ,(byte) 0xAD=-83
有时候,我们会有⼀种特殊的需求,⽐如⽤bit位上的0或者1表明某⼀个值是否存在,如
0000 0101 可以表⽰第0位 -> 1 -> 存在
第1位 -> 0 -> 不存在
第2位 -> 1 -> 存在
……
这样,⼀个byte就能表⽰8个位置是否有值,可⽤于8个不同类型的值是否存在,或者⽤于排序数字
这样做的好处是利⽤⼀个byte有8bit的特点标识8种情况,⼤量节省了空间,并且当⼀个byte转换成⼆进制时,可以⽴即清楚某⼀位是否存在,从这个意义上来说,他⽐你声明8个byte更清晰,⽽且标识的范围更⼴,因为他还可以处理同时存在的逻辑。
当然,有利就有弊,如果想⽤于数据库按标识查询,则需要⼈为来处理多种情况,这甚⾄是及其复杂的,诸如存在mysql某⼀列,⼜需要按字段进⾏条件匹配时,不推荐此⽅式
当获取到byte,判断某⼀位bit是否为1的⽅式
/**
* ⽐如3的⼆进制是 0000 0011
* isBitV1(3,0) 是1 true
* isBitV1(3,1) 是1 true
* isBitV1(3,2) 是0 false
* 判断byte的某⼀位上是否有值
*
* 0x1其实就是1,1的⼆进制是0000 0001
* @param b
* @param position 第⼏位
* @return
*/
private boolean isBitV1(byte b, int position) {
if (position == 0) {
return (b & 0x1) > 0;
} else {
return (b >> position & 0x1) > 0;
}
}
0x1是16进制,表⽰1,之所以很多源码⾥⾯喜欢⽤0x1,⽽不是1,我推测是这样少了⼀次int转2进制或16进制的转换,效率更⾼。