可以(16位)按位并从ADD和SUBtract合成?

时间:2016-05-08 06:40:36

标签: bit-manipulation bitwise-operators

我有两个函数,add和sub,它们接受两个16位参数并返回17位(结果和进位/借位)。

我可以构建一个按位"和"从这些功能?

(合理的小查找表,< 300字节,允许。与位数成比例的运行时很好。)

1 个答案:

答案 0 :(得分:3)

我发现很难猜出你的CPU做了什么和没有做什么,因为你的问题让它看起来基本没什么,但是你的后续评论似乎认为它具有所有的基础知识是理所当然的

所以,我将假设以下内容:

    问题中提供了
  • addsub
  • 创建C风格"功能的适当机制",例如:
    • 一种将记录保存在内存中的方法,这样它们就不会被您正在呼叫的功能踩到。
    • 一种按值获取参数的方法,可以在不影响调用者的情况下销毁。
    • 将结果返回给调用者的方法。
  • 如果一个值小于另一个值,则跳过逻辑部分的方法(类似于X86' s jl"如果少于#34;则跳转。
    • 我将其写为if (a >= b) { ... },意思是"如果b小于a,则跳过接下来的几条指令;之后(否则),运行..."。
  • 足够的基础知识,支持最多299字节的查找表,如问题中所述。

鉴于此,我们可以写这样的东西(用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;。 (你知道为什么吗?)