3

我正在阅读一些关于优化方法的问题。
在如何对特定范围内的数字进行排序的问题中,解决方案是使用位图。如果一个数字可以出现例如多达 10 次,则使用半字节来映射数字并作为计数器来表示出现的次数。
这个概念我很好理解。我的问题是如何以简单的方式在 Java 中实现这一点。

我被困在位操作上。
例如,对于将计数器增加 1 的第一部分,我能想到的是:

定位字节
EgbitValue[i]
然后做得到byte tmp = bitValue[i] & 0x0F低位(如果计数器是低位计数器)。
然后执行tmp = tmp + 11 递增。
然后执行bitValue[i] >> 2清除低端位,然后bitValue[i] <<2恢复。现在我们有与原始相同的高位和清除低位。
然后做bitValue[i] |= tmp设置低位。
现在bitValue低位计数器增加了 1。对吗?

对于高位,这将是相同的过程,但对于高位。

然后当我必须检查计数器的编号是多少时。

我想使用位掩码:
0x0 0x1 0x2等并OR用来检查当前的计数器编号是多少。

所有这些似乎都太复杂了。我在正确的轨道上吗?在 Java 编码中如何最好地处理这些操作?

非常欢迎对此提出任何意见和指导。

4

1 回答 1

3

你肯定在正确的轨道上。这是一些充实的代码,它将 a 的前四位或后四位增加int给定的数量。

请注意,我int在这里使用而不是byte. 即使您的数据是 a byte,通常也更容易将其作为int. 这是因为java 按位运算符喜欢|and&<<return 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;
    }
}
于 2012-04-02T19:59:22.500 回答