我正在阅读有关优化方法的一些问题 在如何对特定范围内的数字进行排序的问题中,解决方案是使用位图。如果一个数字可以出现,例如最多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.对吗?
对于高位,它将是相同的过程,但对于高位。
然后当我必须检查计数器的数量是多少时。
我想用bitmasks:
0x0
0x1
0x2
等,并使用OR
检查当前的计数器编号。
所有这些似乎都太复杂了。我是在正确的轨道上吗?这些操作如何在Java编码中得到最好的解决?
非常欢迎任何意见和指导。
答案 0 :(得分:3)
你肯定是在正确的轨道上。这是一些充实的代码,它将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;
}
}