the restoring division algorithmを実装しようとしていますが、結果が不正確です。私が+、 - 、*、/、%をビット演算子、ループ、ブランチだけを使って実装する必要があります。 add(a,b)
、sub(a,b)
、およびmul(a,b)
を正常に実装しました。そのため、私のdiv(a,b,&rem)
メソッドで使用しました。ここで私はadd
、sub
、およびmul
のすべてのエッジケースと一般的な例をテストしてみたビットワイズ演算子を使用した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;
}
コードは、だと私は、彼らは任意の整数入力のために正常に動作知っています。
どの入力に対しても、q = -1
とremainder = 0
が表示されます。問題はT
、またはq
とn
の署名と関係があると思います。私の実装は同じだと思うが、その方法が-1
と0
を返す理由はあるのだろうか?
どのようなタイプのパラメータですか? Wikipediaコードのコメントに気づいたかどうか:** PとDはNとQの単語幅の2倍を必要とする** – Barmar
@Barmar私の実装では、 'T'は短い – Dando18