復元不可能な整数除算の修正後を把握できません。何らかの理由で私は訂正が必要な箇所を訂正するか、必要なときに修正しないでください。非復元符号付き整数除算後の修正
heres擬似コード。 Dividend
は16ビット、その他は8ビットです。 Dividend_Sign
によって、Remainder_Sign
私はそれらのMSBが1であることを意味するので、2の補数で負です。
LoopCounter = 8;
do {
Shift Dividend Left with 0 in LSB;
if (Dividend_Sign XOR Divisor_Sign) {
Shift 0 into Quotient;
DividendHighByte = DividendHighByte + Divisor;
} else {
shift 1 into Quotient;
DividendHighByte = DividendHighByte - Divisor; // subtraction by 2's complement
}
} while (loopCounter != 0);
Remainder = DividendHighByte;
// here i do the Quotient conversion
invert MSB; // shifted out anyway. Probably should be used for overflow check, not important atm.
shift 1 into Quotient;
今イム私は基本的に正しい答えを持っている時点で、それはただ一つの方法または別のポスト修正する必要がある...かどうか、全ての補正後。すべての訂正事例が何であるかはわかりません。今、私は半分の時間を作業イマイチ何かを持っているが、ここではとにかくです:
if (Dividend_Sign XOR Remainder_sign) { // diff signs so correct
if (Remainder_Sign XOR Divisor_Sign) { // diff signs just add
Remainder = Remainder + Divisor;
Quotient = Quotient - 1;
} else {
Remainder = Remainder - Divisor;
Quotient = Quotient + 1;
}
}
http://en.wikipedia.org/wiki/Division_%28digital%29
http://www.acsel-lab.com/arithmetic/papers/ARITH17/ARITH17_Takagi.pdf
あなたは、動作しないケースを上手の込んだ、または少なくとも列挙もらえますか? –
atmが見つかりました-10:2と-10:-2は正確な事前補正であり、訂正ではそれが失われます。 -16:4は修正する必要がありますが、それはありません。私はそれに0の余りがあるそれらと関係があると思う。 – ollo
訂正が完了したら、残りの部分について必要な要件を説明してください(訂正が完了した時点では無視してください)。 –