c - 给定函数 `decode` ,我如何进行逆运算并将函数写入 `encode` ?

标签 c encoding bit-manipulation

基本上,我有一个称为编码的函数,我想做相反的事情,基本上编码成一个十六进制值。另外,可能值得一提的是我是用 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。

请告诉我,如果这没有意义,我不太擅长写问题:(

最佳答案

如果你有immreg2reg3 是不必要的。使用左移来“撤消”右移。使用按位“或”组合各部分。整个函数看起来像这样:

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

如果只能指定imm 或{reg2, reg3} 对之一,您可以在返回语句:

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

关于c - 给定函数 `decode` ,我如何进行逆运算并将函数写入 `encode` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24790070/

相关文章:

c - swift3.0 无法将类型 '[UnsafeMutablePointer<Int8>]' 的值转换为预期的参数类型 'UnsafeMutablePointer<Int8>?'

mysql - 如何将 MySQL 表更改为 UTF-8?

linux - 如何将带有国家字符的Linux Python 3.4代码转换成windows中的可执行代码

java - 使用位掩码和二进制运算符的排序算法

c - linux 上的 mmap 错误(使用其他东西)

c - 带迭代的洪水填充算法

地穴(): Pointer to integer without cast?

java - 如何设置 JAX-WS 客户端使用 ISO-8859-1 而不是 UTF-8?

javascript - 为什么 ( 无穷大 | 0 ) === 0?

c++ - 二进制输出 C++