我有两个函数,add和sub,它们接受两个16位参数并返回17位(结果和进位/借位)。
我可以构建一个按位"和"从这些功能?
(合理的小查找表,< 300字节,允许。与位数成比例的运行时很好。)
答案 0 :(得分:3)
我发现很难猜出你的CPU做了什么和没有做什么,因为你的问题让它看起来基本没什么,但是你的后续评论似乎认为它具有所有的基础知识是理所当然的
所以,我将假设以下内容:
add
和sub
。jl
"如果少于#34;则跳转。
if (a >= b) { ... }
,意思是"如果b
小于a
,则跳过接下来的几条指令;之后(否则),运行...
"。鉴于此,我们可以写这样的东西(用C表示法):
static int const single_bit_values[] = {
0x8000, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, 0x0100,
0x0080, 0x0040, 0x0020, 0x0010, 0x0008, 0x0004, 0x0002, 0x0001
};
int bitwise_and(int operand1, int operand2) {
int accumulator = 0;
for (int i = 0; i < 16; ++i) {
// set accumulator's bit #i if appropriate:
if (operand1 >= single_bit_values[i] && operand2 >= single_bit_values[i]) {
accumulator += single_bit_values[i];
}
// clear operands' bit #i:
if (operand1 >= single_bit_values[i]) {
operand1 -= single_bit_values[i];
}
if (operand2 >= single_bit_values[i]) {
operand2 -= single_bit_values[i];
}
}
return accumulator;
}
请注意,虽然上面使用了&&
和for循环,但我实际上并不支持其中任何一个;相反,if (... && ...)
可以很容易地扩展为嵌套ifs,并且for循环可以很容易地完全展开。但上述版本更易于人类阅读。
上面的工作方式是,它迭代从高位10000000 00000000
到低位00000000 00000001
的单位值,并且对于每一位,它设置相应的位如果操作数中的相应位都被置位,则累加器。唯一棘手的部分是如何我们检查两个操作数是否都设置;我们所做的是,当我们完成相应的迭代时,我们清除操作数中的每个位(例如,在三次迭代变为11110000 00001111
之后00010000 00001111
),然后让我们写例如operand1 >= single_bit_values[3]
表示&#34; operand1
位#3(第四位)设置&#34;。 (你知道为什么吗?)