为这些类型的字节级操作进行 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:谢谢你的例子!!!很高兴知道我没有迷失在这方面。为了检查什么是计数器编号,我们的想法是检查每个位掩码,例如0x10x2等一一看设置,从而知道柜台里是哪个nuber? counter &amp; 0x0F 获取低位计数器的值,(counter &amp; 0xF0) &gt;&gt; 4 获取高位计数器的值。或者这些不是您要查找的数字? 这个想法是,如果我在输入中有1,则相应的计数器将增加1。如果1 在输入数据中出现4次,则相应的计数器将具有值4(这是增量的作用,跟踪发生)。稍后当我想知道输入中出现了多少1时,我必须以某种方式从计数器中获取数字4。 IE。 1 出现4 次。为此,我想AND 与每个位掩码一一对应。 IE。是0x10x2 在柜台吗? 0x3 在柜台吗?是0x4 在柜台。是的,它是0x4。这是正确的方法吗? 我不确定像您建议的那样循环通过这些位掩码会完成什么(除非我仍然误解您要完成的工作)。您不需要依次尝试每个二进制值。您可以获取计数器的值(使用我上次评论中的表达式)。如果低位计数器增加了四次,那么counter &amp; 0x0F 的值将是0x4 its easiest to work with your data as an int 这在代码可读性上不是更糟吗?例如审查代码的人不清楚在我的示例中我实际上对bytes 而不是ints 感兴趣。或者我没有正确考虑这个?

以上是关于为这些类型的字节级操作进行 java 编码的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在java中将yuv帧编码为视频文件

javad对象序列化(转)

Java 序列化

序列化反序列化api(入门级)

Java字符编码的转化问题

java 怎么获得文件编码格式