Мне нужно прочитать 32-битный адрес в шестнадцатеричном формате (например, 0129ef12) и разделить 32-битные пакеты на 6-5-5-16, которые представляют Opcode-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, которые я указал … Что я делаю не так?
union {
unsigned int address;
unsigned int imm : 16,
rs : 5,
rd : 5,
opcode : 6;
} InstRead;
Посмотрим, повезет ли тебе больше с этим союзом. Это будет зависеть от вашего компилятора.
Ваш код работает для меня (GCC 4.8.3 на Windows 7).
Вы можете использовать битовые операции для извлечения полей более переносимым способом:
imm = address & 0xffff;
rs = address & 0x1f0000 >> 16;
// et cetera