自定义溢出检测

时间:2012-02-29 00:37:54

标签: algorithm math bit-manipulation integer-overflow

我正在使用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 个答案:

答案 0 :(得分:1)

您可以通过计算a找到整数bs及其总和carry-ins = a XOR b XOR s的所有遗产。

当然,随身携带也是前一位位置的结转。

最重要的结转(表示无符号溢出)可以用C / C ++来确定most-significant-carry-out = (a > 0xFF...FF - b),其中0xFF...FF是适当的最大值,ab是非负值。

减法可以减少为加法。查看我对this questionthis question的回答。