按位表示为字节数组函数
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];
}
我正在尝试做一个内存写入程序,作为 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];
}