使用按位运算符在C++中恢复分区实现

问题描述:

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

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; 
} 

我测试过的所有边缘案件和常见的例子为addsub,并且mul我知道他们正常工作的任何整数输入。

看来,对于任何输入我得到q = -1remainder = 0。我认为这个问题与签署Tqn有关。我认为我的实现是一样的,有没有原因为什么该方法返回-10

+1

什么类型的参数?您是否注意到维基百科代码中的评论:** P和D需要两倍于N和Q的字宽** – Barmar

+0

@Barmar在我的实现中'T'是一个短的 – Dando18

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

+0

谢谢我没有抓到,但是,米仍然得到不正确的结果。 – Dando18