给定函数`decode`,我该如何进行反转并将函数写入`encode`?

时间:2014-07-16 20:28:32

标签: c encoding bit-manipulation

基本上,我有一个名为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这样的值。

请告诉我这是否有意义,我写的不是太好:(

1 个答案:

答案 0 :(得分:0)

如果您immreg2reg3是不必要的。使用左移到"撤消"正确的转变。按位使用" OR"组合部分。整个功能看起来像这样:

return ((instrNum  & 0xF) << 12) | ((reg1 & 0xF) << 8) | imm;

如果只能指定imm或{reg2reg3}对中的一个,则可以在return声明之前执行此准备步骤:

if (!imm) imm = ((reg2 & 0xF) << 8) | (reg3 & 0xF);