【问题标题】:Custom overflow detection自定义溢出检测
【发布时间】:2012-02-29 00:37:53
【问题描述】:

我正在使用 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)

有更好的方法吗?

【问题讨论】:

    标签: algorithm math bit-manipulation integer-overflow


    【解决方案1】:

    您可以通过计算carry-ins = a XOR b XOR s 找到整数ab 及其和s 中的所有进位。

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

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

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

    【讨论】:

    • 我不确定这种方法是否能满足我的需要;当我使用 tesseral 算术时,我首先将我正在研究的单词中的位解序。然后,我需要同时检查两个位置的进位;一个用于 x 坐标,一个用于 y。在上面的例子中,我有类似 00000xxx00000xxxb 的东西(其中每个 x 是一些有意义的值,每个 0 不是),所以分配一个最大数字只会对左子词有帮助。
    • 如果有帮助,我也只对正空间感兴趣,所以 a 和 b 将始终是正值。每个子词只会增加或减少一个,这进一步简化了事情 - 我知道进位会发生在哪里,如果他们这样做的话。我最感兴趣的是速度。有没有更好的方法来检查这些特定位的更改? (抱歉重复发布;一条评论不适合)
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多