Java 将4个字节转换为无符号32位整数,并将其存储在长

Java 将4个字节转换为无符号32位整数,并将其存储在长,java,bit-manipulation,Java,Bit Manipulation,我正在尝试用Java读取一个二进制文件。我需要读取无符号8位值、无符号16位值和无符号32位值的方法。做这件事最好的方法是什么(最快、最好看的代码)?我已经在C++中做过这样的事情: uint8_t *buffer; uint32_t value = buffer[0] | buffer[1] << 8 | buffer[2] << 16 | buffer[3] << 24; public long getUInt32() throws EOFExcepti

我正在尝试用Java读取一个二进制文件。我需要读取无符号8位值、无符号16位值和无符号32位值的方法。做这件事最好的方法是什么(最快、最好看的代码)?我已经在C++中做过这样的事情:

uint8_t *buffer;
uint32_t value = buffer[0] | buffer[1] << 8 | buffer[2] << 16 | buffer[3] << 24;
public long getUInt32() throws EOFException, IOException {
    byte[] bytes = getBytes(4);
    long value = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);
    return value & 0x00000000FFFFFFFFL;
}
uint8_t*缓冲区;

uint32_t value=buffer[0]| buffer[1]你的想法是对的,我认为没有任何明显的改进。如果你看一下,他们有相同的代码。它们切换
的顺序。更常规的版本首先将字节转换为整数形式的无符号值:

public long getUInt32() throws EOFException, IOException {
    byte[] bytes = getBytes(4);
    long value = 
        ((bytes[0] & 0xFF) <<  0) |
        ((bytes[1] & 0xFF) <<  8) |
        ((bytes[2] & 0xFF) << 16) |
        ((long) (bytes[3] & 0xFF) << 24);
    return value;
}
public long getUInt32()抛出EOFEException,IOException{
byte[]bytes=getBytes(4);
长值=

((字节[0]&0xFF)如果使用的变量很长,则ALU将始终在64位上执行操作。如果变量为int,则ALU始终在32位上执行操作(并保留ALU功能的其他32位未使用)。对一个字节的操作很可能会使ALU的58位未使用。这些操作总是在一个时钟周期内进行,因此没有一句好话说10位太多。不,您的工作实现正是正确的方法。您不需要上面代码中的最后一个按位and操作:value |=(字节[3]需要使用((长)(字节[+3]&0xFF)
DataInputStream d = new DataInputStream(new FileInputStream("myfile"));
d.readInt();
public long getUInt32() throws EOFException, IOException {
    byte[] bytes = getBytes(4);
    long value = 
        ((bytes[0] & 0xFF) <<  0) |
        ((bytes[1] & 0xFF) <<  8) |
        ((bytes[2] & 0xFF) << 16) |
        ((long) (bytes[3] & 0xFF) << 24);
    return value;
}