【问题标题】:bit manipulation in javajava中的位操作
【发布时间】:2010-05-29 17:41:00
【问题描述】:

我在 byte[] 中有一个字节片段。数组的总大小为 4,我想将其转换为正长数。例如,如果字节数组有四个字节 101、110、10、10000001,那么我想得到二进制序列表示的长数

00000000 00000000 00000000 00000000 00000101 00000110 00000010 10000001

等于 84279937

在 Java 中执行此操作的有效方法是什么?

【问题讨论】:

    标签: java numbers byte math bitwise-operators


    【解决方案1】:

    假设小端,

    (b[0] & 0xFF) | (b[1] & 0xFF) << 8 | (b[2] & 0xFF) << 16 | (b[3] & 0xFF) << 24
    

    例如,http://www.ideone.com/p68zS

    &amp; 0xFF 用于将有符号字节转换为无符号字节...

    【讨论】:

    • 我假设你的意思是字节[3] |字节[2]
    • @sarav:如果要保留最后一个字节的符号,就省略最后一个&amp; 0xFF
    • @sarav:那些&amp; 0xFF故意添加的,以防止...1111111110000001
    • 对不起,我错过了&amp; 0xFF .. 没有刷新页面以查看您的更新答案。有效。非常感谢。
    【解决方案2】:

    不知道效率,但由于one of BigInteger's constructors得到一个字节数组,这可能是一个很简单的方法:

    import java.math.BigInteger;
    
    ...
    
    long value = new BigInteger(myByteArray).longValue();
    

    当然,您必须注意字节以二进制补码形式给出,并注意它们首先以最高有效字节给出 - 所以在您的情况下,您可能希望用另外 4 个填充数组的开头空字节。

    【讨论】:

      【解决方案3】:
      ByteBuffer buf = ByteBuffer.allocate(8); 
      buf.put(4, b[0]).put(5, b[1]).put(6, b[2]).put(7, b[3]);
      long longVal = buf.getLong();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多