基本上,我有一个名为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这样的值。
请告诉我这是否有意义,我写的不是太好:(
答案 0 :(得分:0)
如果您imm
,reg2
和reg3
是不必要的。使用左移到"撤消"正确的转变。按位使用" OR"组合部分。整个功能看起来像这样:
return ((instrNum & 0xF) << 12) | ((reg1 & 0xF) << 8) | imm;
如果只能指定imm
或{reg2
,reg3
}对中的一个,则可以在return
声明之前执行此准备步骤:
if (!imm) imm = ((reg2 & 0xF) << 8) | (reg3 & 0xF);