Java中无需转换为long实现uint32_t无符号取模运算的方法
无符号int取模的无long转换实现
完全可以不转换为long类型完成计算,Java 8及以上版本已经提供了对应的原生API支持。
最优实现方案
直接使用java.lang.Integer类提供的remainderUnsigned方法即可,这个方法专门用于对int类型的值做无符号取模运算,内部实现完全不涉及long类型转换,性能更优:
int i = 0xffffffff; int mod = Integer.remainderUnsigned(i, 42);
运算结果和你现有转long的实现完全一致。
原理解释
Integer.remainderUnsigned会将输入的int参数视为32位无符号整数执行取模操作,完美匹配C语言uint32_t类型的取模逻辑- 相比转long再取模的实现,原生API没有类型转换的额外开销,代码也更简洁易读
低版本Java兼容方案
如果你使用的是Java 8以下的版本,也可以手动实现无符号取模逻辑,仅当被除数为负时才会触发long转换,大部分场景下无额外开销:
public static int unsignedMod(int dividend, int divisor) { if (divisor <= 0) { throw new IllegalArgumentException("divisor must be positive"); } if (dividend >= 0) { return dividend % divisor; } long unsignedValue = (dividend & 0xFFFFFFFFL); return (int) (unsignedValue % divisor); }
内容的提问来源于stack exchange,提问作者Alexander Torstling
相关产品推荐
相关产品推荐

