按位表示为字节数组函数

Bitwise representation into a byte array function

我正在尝试做一个内存写入程序,作为 CPU 模拟程序的一部分,但我不明白。我正在制作一个函数,将 int 值写入内存,该内存是 byte 双数组分解成段。现在,我不明白为什么下面的 writeWord 函数可能不起作用,我会 post 相关代码以及函数。

public class RealMemory implements Memory {
    public static final int BYTES_PER_INT = 4;
    public static final int BITS_PER_BYTE = 8;
    private final int segmentSize;
    private final int numberOfSegments; 

    private byte[][] memory;
    
    public RealMemory (int segmentSize, int numberOfSegments) {
        this.segmentSize = segmentSize;
        this.numberOfSegments = numberOfSegments;
        this.memory = new byte[this.numberOfSegments][this.segmentSize];
    }

    private byte[] getSegment(int segment) {
        assert(segment >= 0 && segment < numberOfSegments);
        return memory[segment];
    }

    public void writeWord (int segment, int offset, int value) {
        assert (offset >= 0 && offset < segmentSize - BYTES_PER_INT
             && offset % BYTES_PER_INT == 0);
        byte[] byteword = new byte[BYTES_PER_INT];
        int mask = 1;
        for (int i=offset; i < offset + BYTES_PER_INT; i++) {
            byteword[i-offset] = (byte) (value & mask);
            mask <<= 1;
            getSegment(segment)[i]=byteword[i-offset];
        }
    }
}

我知道我尝试将值分解为位的方式是错误的,我只是不完全理解这里需要的按位运算是我的猜测。有帮助吗?

您的问题是mask = 1。您不读取字节,而是读取单个位。

要读取字节,请使用 int mask = (1 << BITS_PER_BYTE) - 1;mask <<= BITS_PER_BYTE;。一旦你屏蔽了相关部分,你还必须将它向右移动。正如 Stanislav Bashkyrtsev 所建议的,这可以直接在 value 上完成,而不是移动掩码。

int mask = (1 << BITS_PER_BYTE) - 1;
for (int i=offset; i < offset + BYTES_PER_INT; i++) {
    byteword[i-offset] = (byte) (value & mask);
    value >>= BITS_PER_BYTE;
    getSegment(segment)[i]=byteword[i-offset];
}