为这些类型的字节级操作进行 java 编码的最佳方法是啥?
Posted
技术标签:
【中文标题】为这些类型的字节级操作进行 java 编码的最佳方法是啥?【英文标题】:What is the best way to do java coding for these type of byte level operations?为这些类型的字节级操作进行 java 编码的最佳方法是什么? 【发布时间】:2012-04-16 11:43:57 【问题描述】:我正在阅读一些关于优化方法的问题。 在如何对特定范围内的数字进行排序的问题中,解决方案是使用位图。如果可以出现一个数字,例如最多 10 次使用半字节来映射数字并作为计数器来表示出现次数。 这个概念我很好理解。我的问题是如何以简单的方式在 Java 中实现这一点。
我卡在位操作上。 例如,对于将计数器增加 1 的第一部分,我能想到的是:
定位字节
例如。 bitValue[i]
然后执行byte tmp = bitValue[i] & 0x0F
以获取低位(如果计数器是低位计数器)。
然后执行 tmp = tmp + 1
以增加 1。
然后执行bitValue[i] >> 2
清除低端位,然后执行bitValue[i] <<2
恢复。现在我们有与原始相同的高位和清除低位。
然后执行bitValue[i] |= tmp
设置低位。
现在bitValue
的低位计数器增加了 1。对吗?
对于高位,这将是相同的过程,但对于高位。
然后当我必须检查计数器的编号时。
我想使用位掩码:0x0
0x1
0x2
等并使用 OR
检查当前计数器编号是多少。
所有这些似乎都太复杂了。我在正确的轨道上吗?在 Java 编码中如何最好地处理这些操作?
非常欢迎对此提供任何意见和指导。
【问题讨论】:
你是在学习优化还是优化?如果您实际上是在优化,您是否发现了性能问题,或者您是否假设您正在做的事情是必要的? FWIW,可能没有必要。 【参考方案1】:您绝对是在正确的轨道上。这是一些充实的代码,它将int
的前四位或后四位增加给定的数量。
请注意,我在这里使用int
而不是byte
。即使您的数据是byte
,通常也更容易将其用作int
。这是因为java bitwise operators 喜欢|
和&
和<<
返回int
。因此,最容易将您的数据作为int
处理,然后在您完成所有操作后回退。
此外,如果您需要在每位级别上处理大量数据(可能不仅仅是您提到的两个计数器),您可以考虑查看BitSet。
public class Test
public static void main(String[] args)
int counter = 0;
// increment the low bits by 3 and high bits by 2
counter = addLowBits( counter, 3 );
counter = addHighBits( counter, 2 );
// print the hex string to verify
System.out.println( Integer.toHexString( counter ) );
System.out.println( "Low Counter: " + ( counter & 0x0F ) );
System.out.println( "High Counter: " + ( ( counter & 0xF0 ) >> 4 ) );
public static int addLowBits( int counter, int increment )
// get the low bits
int low = counter & 0x0F;
// increment by 1
low = low + increment;
// mask the high bits and insert new low bits
counter = (counter & 0xF0) | low;
return counter;
public static int addHighBits( int counter, int increment )
// now get high bits
int high = ( counter & 0xF0 ) >> 4;
// increment by 1
high = high + increment;
// mask the low bits and insert new high bits
counter = (counter & 0x0F) | ( high << 4 );
return counter;
【讨论】:
+1:谢谢你的例子!!!很高兴知道我没有迷失在这方面。为了检查什么是计数器编号,我们的想法是检查每个位掩码,例如0x1
0x2
等一一看设置,从而知道柜台里是哪个nuber?
counter & 0x0F
获取低位计数器的值,(counter & 0xF0) >> 4
获取高位计数器的值。或者这些不是您要查找的数字?
这个想法是,如果我在输入中有1
,则相应的计数器将增加1
。如果1
在输入数据中出现4次,则相应的计数器将具有值4
(这是增量的作用,跟踪发生)。稍后当我想知道输入中出现了多少1
时,我必须以某种方式从计数器中获取数字4
。 IE。 1
出现4
次。为此,我想AND
与每个位掩码一一对应。 IE。是0x1
? 0x2
在柜台吗? 0x3
在柜台吗?是0x4
在柜台。是的,它是0x4
。这是正确的方法吗?
我不确定像您建议的那样循环通过这些位掩码会完成什么(除非我仍然误解您要完成的工作)。您不需要依次尝试每个二进制值。您可以获取计数器的值(使用我上次评论中的表达式)。如果低位计数器增加了四次,那么counter & 0x0F
的值将是0x4
。
its easiest to work with your data as an int
这在代码可读性上不是更糟吗?例如审查代码的人不清楚在我的示例中我实际上对bytes
而不是ints
感兴趣。或者我没有正确考虑这个?以上是关于为这些类型的字节级操作进行 java 编码的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章