我需要读取十六进制格式的32位地址(例如: 0129ef12),并将32位拆分为6-5-5-16个数据包,分别表示操作码-Rd-Rs-Immediate。
这就是我到目前为止所知道的:
typedef unsigned char u8;
typedef unsigned short u16;
union {
unsigned int address;
struct {
u16 imm : 16;
u8 rs : 5;
u8 rd : 5;
u8 opcode : 6;
} i;
} InstRead;
InstRead.address = 0x0129ef12;
cout << hex << int(InstRead.i.opcode) << "\n";
cout << hex << int(InstRead.i.rs) << "\n";
cout << hex << int(InstRead.i.rd) << "\n";
cout << hex << int(InstRead.i.imm) << "\n";然而,这并不能给出正确的输出...也就是说,没有按照我指定的长度6-5-5-16选择比特...我做错了什么?
发布于 2015-05-29 07:09:44
union {
unsigned int address;
unsigned int imm : 16,
rs : 5,
rd : 5,
opcode : 6;
} InstRead;看看你和那个联盟有没有更好的运气。不过,这将取决于您的编译器。
发布于 2015-05-29 08:28:35
你的代码适用于我(Windows7下的gcc 4.8.3 )。
您可以使用位操作以更便携的方式提取字段:
imm = address & 0xffff;
rs = address & 0x1f0000 >> 16;
// et ceterahttps://stackoverflow.com/questions/30517315
复制相似问题