在java中解码字节

在java中解码字节,java,bit-manipulation,Java,Bit Manipulation,我无法理解的代码执行以下操作: int decodeTimeStampByte(final byte timeByte) { return timeByte & (~64); } 例如,如果我得到字节4c,也就是ASCII L,那么上面的函数会对它做什么呢?字节44如何?的“~”是按位“非”,因此64=0x40=0100000b和~64=1011111b是较低的5位集 然后“&”是按位的“and”,它只剩下时间字节的5个低位。所以,基本上,它是一个时间字节到0..63范围的截断

我无法理解的代码执行以下操作:

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

例如,如果我得到字节4c,也就是ASCII L,那么上面的函数会对它做什么呢?字节44如何?

的“~”是按位“非”,因此64=0x40=0100000b和~64=1011111b是较低的5位集

然后“&”是按位的“and”,它只剩下时间字节的5个低位。所以,基本上,它是一个时间字节到0..63范围的截断

解码字节4c=0xC 12

解码字节44=44

是的,我忘了高一点的~64=1011111b

这要么是代码中的一个bug,要么是有意将符号位保留在第7位


p.p.S.似乎是一个古老的位黑客,用来压缩更多的性能,“~”是按位的“not”,因此64=0x40=0100000b,~64=1011111b是较低的5位集

然后“&”是按位的“and”,它只剩下时间字节的5个低位。所以,基本上,它是一个时间字节到0..63范围的截断

解码字节4c=0xC 12

解码字节44=44

是的,我忘了高一点的~64=1011111b

这要么是代码中的一个bug,要么是有意将符号位保留在第7位



p.p.S.似乎是一个古老的位黑客,用来压缩更多的性能

此函数返回较低的6位为正值,清除第7位为负值。因此,二进制中的2^6=64,64=1000000,~64=01111111将屏蔽时间字节的[0..63]和[-128..-65]之间的值。

此函数返回正值的较低6位,清除负值的第7位。因此,二进制中的2^6=64,64=1000000,~64=011111将屏蔽时间字节[0..63]和[-128..-65]之间的值。

此代码将清除位6。但如果设置了位7,则由于将字节强制转换为int,它将设置8到31之间的所有位。此代码将清除位6。但是,如果设置了位7,则由于将字节强制转换为int,它将设置8到31之间的所有位。此函数将返回较低的6位作为正值,并清除第7位作为负值。因此,二进制中的2^6=64,64=1000000,~64=01111111将屏蔽时间字节的[0..63]和[-128..-65]之间的值。

此函数返回正值的较低6位,清除负值的第7位。因此,二进制中的2^6=64,64=1000000,~64=01111111会屏蔽时间字节[0..63]和[-128..-65]之间的值。

这…似乎没有任何用处或意义。关于没有人知道C,现在Tiobe社区索引认为C是最流行的语言好的,对此进行一点细分,~64的作用是什么?如果你删除最后一个,这将是C,并且会做同样的事情,你可能需要刷新你的C编辑和字节->字符或something@Musa考虑到c没有字节,并且c的字符通常是无符号的,尽管规范没有保证afaik,但没有必要,尽管在这种情况下我认为是的。在C中,这是清除一点的通常方法。。虽然通常你会把它写成x&~1,但这…似乎没有任何用处或意义。关于没有人知道C,现在C被Tiobe社区索引认为是最流行的语言好吧,把它分解一下,~64做什么?如果你去掉最后一个,这将是C,也会做同样的事情,您可能需要重新学习C编辑和byte->char或something@Musa考虑到c没有字节,并且c的字符通常是无符号的,尽管规范没有保证afaik,但没有必要,尽管在这种情况下我认为是的。在C中,这是清除一点的通常方法。。虽然通常你会把它写成x&~1,为什么?根据其他答案,~64等于01111b。那么第7位不也是0吗,就像0011111B一样?0 & 1 = 0. 第7位是如何设置的?它只是反转64,这总是导致0001111b的掩码。它不是反转变量timeByte。快速Java测试确认127作为输入导致63作为结果。设置位7时尝试255,看看结果如何。请注意,位是从0开始计算的,而不是从1开始计算的。这是为什么?根据其他答案,~64等于01111b。那么第7位不也是0吗,就像0011111B一样?0 & 1 = 0. 第7位是如何设置的?它只是反转64,这总是导致0001111b的掩码。它不是反转变量timeByte。快速Java测试确认127作为输入导致63作为结果。设置位7时尝试255,看看结果如何。请注意,位是从0开始计算的,而不是从1开始计算的。实际上64=1000000b和~64=01111B,java中的字节也只有7位,第8位呢?实际上64=1000000b和~64=01111111B,java中的字节也只有7位,第8位呢?还要注意输入的字节负值。最终的范围并不总是0..63。是的,这看起来就像是直接借用了一个旧的C代码库:如果一个人有一个P
ascal背景,那么字节的“有符号性”可能不会出现在脑海中。是的,thx rico-我验证了需要以这种奇怪的方式解码的值的域,只有规范中需要这样做的部分都在127位以下,因此将事情限制在6位及以下。所以人们提到的符号位不会是一个因素。也要注意负字节值作为输入。最终的范围并不总是0..63。是的,这看起来像是直接借用了旧的C代码库:如果一个人有帕斯卡背景,那么字节的“有符号性”可能就不在我的脑海中了。是的,thx rico-我验证了需要以这种奇怪的方式解码的值的域,只有部分规范中需要这样做的地方都在127位以下,因此将事情减少到6位或更少。所以人们提到的符号位不会成为一个因素。