使用按位运算符恢复C ++中的部门实现

时间:2017-09-08 21:35:49

标签: c++ bit-manipulation division

我正在尝试实施the restoring division algorithm,但我一直收到不正确的结果。诀窍是我的任务要求我只使用按位运算符,循环和分支来实现+, - ,*,/,%。我已成功实施add(a,b)sub(a,b)mul(a,b),因此可以在我的div(a,b,&rem)方法中使用它们。这是代码,

template<typename T>
T div(T dividend, T divisor, T &remainder){
    unsigned q = 1;
    unsigned n = mul(sizeof(T), CHAR_BIT);
    remainder = dividend;
    divisor <<= n;

    for(int i=sub(n,1); i>=0; i=sub(i,1)) {
        remainder = sub(remainder << 1, divisor);
        if(remainder < 0) {
            q &= ~(1 << i);  // set i-th bit to 0
            remainder = add(remainder, divisor);
        } else {
            q |= 1 << i;     // set i-th bit to 1
        }
    }
    return q;
}

我已经测试了addsubmul的所有边缘情况和常见示例,我知道它们对任何整数输入都能正常工作。

对于任何输入,我都会看到q = -1remainder = 0。我认为问题与签署Tqn有关。我认为我的实现是一样的,该方法返回-10是否有原因?

2 个答案:

答案 0 :(得分:1)

您需要更仔细地检查算法。您的if(q < 0)比较使用了错误的变量。它应该是if (remainder < 0)

答案 1 :(得分:1)

您提到这可能与Tqn的签名有关。您还在评论中提到,您对T的实现是short

引用https://en.cppreference.com/w/cpp/language/types

您的类型T始终至少为16位,但是所示的div函数中的中间值通常为unsignedint,可能是{{ 1}}位,具体取决于数据模型。

因此,您返回的值将被截断为32类型持有人的可能较小的大小,以产生预期的结果。