- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个空头,instr
,看起来像这样:
1110xxx111111111
我需要取出位 0-9,我用 (instr & 0x1FF)
来做.然后将该数量存储在一个新的空头中。问题是,当发生这种情况时,它会变成 0x0000000111111111
, 不是 0x1111111111111111
就像我想要的那样。我怎样才能解决这个问题?谢谢!
代码如下:
short instr = state->mem[state->pc];
unsigned int reg = instr >> 9 & 7; // 0b111
state->regs[reg] = state->pc + (instr & 0x1FF);
这是一个以汇编形式读取的模拟器。 state
是机器,regs[]
是寄存器和pc
是mem[]
中当前指令的地址.
如果最后九位代表一个正数,这很好,但如果它们代表 -1,它存储为全 1,我的代码将其解释为正值。
最佳答案
假设一个 short 是 16 位:
您可以手动完成:(instr & 0x1FF) | ((instr & 0x100) ? 0xFE00 : 0)
.这将测试符号位(您保留的最高位,0x100
),如果设置了符号位,则设置其上方的所有位。您可以通过将掩码调整为 0x1F
将其扩展到 5 位, 0x10
和 0xFFE0
, 作为低 5 位,第 5 位本身和所有的位 5-16 分别。
或者您可以找一些借口将这些位分配给带符号的 short 的上部并将它们向下移动(在此过程中获得符号扩展):short x = (instr & 0x1FF) << 7; x >>= 7;
后者实际上可能最终在组装中更加直接,并且不会涉及分支。如果instr
是 signed 这可以在单个表达式中完成:(instr & 0x1FF) << 7 >> 7
.由于这已经删除了高位,因此它简化为 instr << 7 >> 7
.对于 5 位 (16-5),将 7 替换为 11。
关于c - 符号扩展 C 中的九位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5814072/
我是一名优秀的程序员,十分优秀!