4

我编写了一个解释器,要求我对无符号整数执行 32 位除法。在 Java 中,我可以这样做:

reg[a] = (int) ((reg[b] & 0xFFFFFFFFL) / (reg[c] & 0xFFFFFFFFL));

但我想避免转换为 long 并返回 int。Java 已经为这种特殊情况提供了无符号右移运算符>>>,因此也许有一种聪明的方法可以以相同的方式进行无符号除法。

请注意,加法和乘法可以正常工作,因为二进制的补码可以正常工作。

Java中有没有更好的方法来做到这一点?

4

3 回答 3

1

好吧,如果你向下移动一位,你可以将得到的两个数字相除,然后向上移动两次(因为结果数字会小 4 倍)。但这仅适用于偶数,因为您会丢失最低有效位。

我真的认为这不会为您节省任何时间来检查这种情况。(或检查小于 2 31的数字)

于 2009-12-19T04:18:38.913 回答
1

在 Java 8 及更高版本中,Integer对 unsigned ints有完整的操作集合

reg[a] = Integer.divideUnsigned(reg[b], reg[c]);
于 2021-01-02T05:18:41.217 回答
-1

您总是可以使用BigInteger,它适用于任意大小的整数,但这比提升为long并转换为int. 您打算提高性能(因此您想要一个“纯整数”解决方案来避免强制转换时间)还是提高代码的可读性/可理解性(在这种情况下 BigInteger 可能更整洁)?

于 2009-12-19T04:24:08.797 回答