基本上,我有一个称为编码的函数,我想做相反的事情,基本上编码成一个十六进制值。另外,可能值得一提的是我是用 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
是不必要的。使用左移来“撤消”右移。使用按位“或”组合各部分。整个函数看起来像这样:
return ((instrNum & 0xF) << 12) | ((reg1 & 0xF) << 8) | imm;
如果只能指定imm
或{reg2
, reg3
} 对之一,您可以在返回
语句:
if (!imm) imm = ((reg2 & 0xF) << 8) | (reg3 & 0xF);
我是一名优秀的程序员,十分优秀!