基本上,我有一个名为encode的函数,我想做相反的事情,基本上编码成十六进制值。此外,值得一提的是,我正在用c语言写作。
void decode(somestruct *thing, int instr) {
thing->instrNum = (instr & 0xF000) >> 12;
thing->reg1 = (instr & 0xF00 ) >> 8;
thing->reg2 = (instr & 0xF0 ) >> 4;
thing->reg3 = (instr & 0xF );
thing->imm = (instr & 0xFF );
}
有什么办法我可以做到这一点,最好是越小越好:)我正在考虑这样布局:
int encode(int instrNum, int reg1, int reg2, int reg3, int imm) {
// do conversion to base 2 then base 16
return the_base_16_conversion;
}
理想情况下,我希望它返回一个值,如0x6100。
请告诉我,如果这没有意义,我不太擅长写问题:(
如果您有imm
,则不需要reg2
和reg3
。使用左移来"撤销"右移。使用按位"OR"来组合各部分。整个函数看起来像这样:
return ((instrNum & 0xF) << 12) | ((reg1 & 0xF) << 8) | imm;
如果只能指定imm
或{reg2
, reg3
}对中的一个,则可以在return
语句之前执行此准备步骤:
if (!imm) imm = ((reg2 & 0xF) << 8) | (reg3 & 0xF);