编程语言
首页 > 编程语言> > 对这些类型的字节级操作进行Java编码的最佳方法是什么?

对这些类型的字节级操作进行Java编码的最佳方法是什么?

作者:互联网

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

我被限制在位操作上.
例如,对于第一部分,将计数器加1,我可以想到的是:

找到字节
例如. bitValue [i]
然后执行字节tmp = bitValue [i]& 0x0F获取低位(如果计数器为低计数器).
然后执行tmp = tmp 1递增1.
然后执行bitValue [i]>> 2清除低端位,然后bitValue [i] << 2恢复.现在我们具有与原始位相同的高位,而低位清零.
然后执行bitValue [i] | = tmp设置低位.
现在,bitValue的低位计数器增加了1.

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

然后,当我必须检查计数器的数量是多少时.

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

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

任何意见,指导都非常欢迎.

解决方法:

您肯定在正确的轨道上.这是一些充实的代码,可以将int的前四位或后四位增加给定的数量.

请注意,我在这里使用int而不是字节.即使您的数据是一个字节,通常也更容易将其作为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;
    }
}

标签:bit,bit-manipulation,programming-pearls,java
来源: https://codeday.me/bug/20191201/2081495.html