非恢复有符号整数除法后更正

时间:2012-04-22 23:10:28

标签: algorithm math binary integer-division divider

我无法弄清楚非恢复整数除法的后修正。出于某种原因,我不断得到我纠正的情况,如果不需要更正,或者在需要时不正确

这是算法的伪代码。 Dividend是16位,其他是8位。 Dividend_SignRemainder_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

1 个答案:

答案 0 :(得分:1)

该算法有效,问题是2s补码有负零。如果最终余数为0,则不需要进行任何修正。但是算法必须在周期内检测到0余数,如果遇到一个,则总是需要校正。

刚刚添加了一个0余数标志并执行了此操作:

if (!Remainder.isEmpty() && (zeroFlag || (Dividend.Sign() XOR Remainder.Sign())))
      ...do corrections