2012-02-29 48 views
0

我正在做一些使用tesseral算术的工作,我需要检测一个单词的特定区域中的进位。由于程序的性质,位的位置取决于输入。例如,对于一个32位的字长和一个6位的输入,我有兴趣检查第19和3位的加法运算,第31和15位进行减法运算(更一般地,有趣的位是(字长 - 1),(字大小/ 2 +输入位/ 2),(字大小/ 2-1)和(输入位/ 2))。自定义溢出检测

我在想什么是沿着线的东西:

(after addition)   ((NumberToCheck & (1 << 19 + 1 << 3)) != 0) --> carried bit(s) 

    (or after subtraction) ((NumberToCheck & (1 << 31 + 1 << 15)) != 0) --> carried bit(s) 

有没有更好的办法呢?

回答

1

通过计算carry-ins = a XOR b XOR s,您可以从整数a,b及其总和s中找到所有插入。

当然,进位也是前一位位置的进位。

最显著搬出(表示无符号溢出)可以用来确定,在C/C++说话,most-significant-carry-out = (a > 0xFF...FF - b),其中0xFF...FF是适当的最大值和ab都是非负的值。

减法可以简化为加法。请参阅我的回答this questionthis question

+0

我不确定这种方法会做我需要的;当我使用tesseral算术时,我首先解决了我正在处理的单词中的一些问题。然后,我需要立即检查两个地点的运输情况;一个用于x坐标,另一个用于y。在上面的例子中,我有类似00000xxx00000xxxb(其中每个x是一些有意义的值,每个0都不是),所以分配最大数目只会帮助左子字。 – bendicott 2012-03-02 02:13:09

+0

如果有帮助,我也只对积极空间感兴趣,所以a和b将始终是积极的价值。每个子词只会增加或减少一个,这进一步简化了事情 - 如果他们这样做,我知道这些承载发生在哪里。我主要对速度感兴趣;有没有更好的方法来检查这些特定位的更改? (对于双重发布,不适合一个评论) – bendicott 2012-03-02 02:13:29