我正在尝试实施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;
}
我已经测试了add
,sub
和mul
的所有边缘情况和常见示例,我知道它们对任何整数输入都能正常工作。
对于任何输入,我都会看到q = -1
和remainder = 0
。我认为问题与签署T
或q
和n
有关。我认为我的实现是一样的,该方法返回-1
和0
是否有原因?
答案 0 :(得分:1)
您需要更仔细地检查算法。您的if(q < 0)
比较使用了错误的变量。它应该是if (remainder < 0)
。
答案 1 :(得分:1)
您提到这可能与T
或q
和n
的签名有关。您还在评论中提到,您对T的实现是short
。
引用https://en.cppreference.com/w/cpp/language/types,
您的类型T始终至少为16
位,但是所示的div
函数中的中间值通常为unsigned
或int
,可能是{{ 1}}位,具体取决于数据模型。
因此,您返回的值将被截断为32
类型持有人的可能较小的大小,以产生预期的结果。