为这些类型的字节级操作执行java编码的最佳方法是什么?

时间:2012-04-02 19:44:26

标签: java bit-manipulation bit programming-pearls

我正在阅读有关优化方法的一些问题 在如何对特定范围内的数字进行排序的问题中,解决方案是使用位图。如果一个数字可以出现,例如最多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编码中得到最好的解决?

非常欢迎任何意见和指导。

1 个答案:

答案 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;
    }
}