在java中解码一个字节

时间:2012-04-27 22:09:01

标签: java bit-manipulation

我无法理解的代码是这样的:

int decodeTimeStampByte(final byte timeByte) {
   return timeByte & (~64);
}

因此,例如,如果我得到字节4c(它是ASCII L),上面的函数到底会做什么呢?字节44怎么样?

4 个答案:

答案 0 :(得分:3)

'〜'按位'不',所以64 = 0x40 = 0100000b和~64 = 1011111b(设置低5位)。

然后'&'是按位'和',它只留下timeByte的低5位。所以,基本上,它是timeByte到0..63范围的截断。

decodeTimeStampByte(4c)= 0xC(12)

decodeTimeStampByte(44)= 44

P.S。是的,我忘记了更高的位。 ~64 = 1011111b。

这可能是代码中的错误,也可能是留下符号位(第7位)的意图。

P.P.S。看起来像是一个古老的比特黑客,以挤压更多的表现

答案 1 :(得分:2)

此代码将清除第6位。但如果第7位置1,则将所有位从8设置为31(由于将字节转换为int)

答案 2 :(得分:1)

此函数返回低6位为正值,清除第7位为负值。因此,2 ^ 6 = 64,64 = 1000000二进制,~64 = 0111111(二进制)将掩盖timeByte的[0..63]和[-128 ..- 65]之间的值。

答案 3 :(得分:0)

此函数返回低6位为正值,清除第7位为负值。因此,二进制的2^6=64, 64 = 1000000,二进制的~64 = 0111111会掩盖[0..63]的{​​{1}}和[-128..-65]之间的值。