从整数中删除符号扩展名?

时间:2015-04-11 18:05:46

标签: c++ bit-manipulation bitwise-operators

我正在尝试以二进制格式构造机器指令loadi。机器指令本身由操作码组成,操作码是00000目标寄存器,立即位和一些常量值。它应该是这样的:

00000 00 0 00000000

假设我们想要执行指令loadi 2 -123。这将转换为机器指令:

0000010110000101

我正在尝试使用bitshifting构建此机器代码。我首先将目的地寄存器移到正确的位置。然后,我转移立即位值:

instr = (dr << 9); // Destination register
instr += (1 << 8); // Immediate bit value

这将产生:

00000 10 1 00000000

我需要添加以完成指令并生成目标代码的最后一部分是常量值-123。但问题是,当我尝试:

instr += constant;

它不起作用。我不需要在这里做位移,因为我希望它从第0位开始。经过一些测试后,我认为问题可能是因为-123是符号扩展。我只想要前8位。

是否有一种简单的方法来检索-123的前8位?

此问题中的所有值均由int类型表示。但是,我只使用第一个16 bits

1 个答案:

答案 0 :(得分:0)

您需要对值进行掩码:

instr = (opCode << 11)
        | (reg << 9)
        | (1 << 8)
        | (value & 0xff);

一般情况下:你可能想要掩盖所有的值;那 这是合乎逻辑的。但希望regopCode永远不会 是可以设置未使用位的值。

另外:这只有目标机器和 主机具有相同的负数表示形式 表示没有签名。 (当然,今天,2&#39; s 补充几乎是普遍的。但它可能值得检查 确切地说loadi如何解释其值字段。)