我有以下Java代码:
long num = 3482085570325547757;
// Discard all but the highest priority 31 bits
int result = (int) (num >>> 33); // Returns 405368112我正在尝试用Javascript做同样的事情(使用https://github.com/oracle/graaljs引擎),但是,它给我的结果不同于Java代码:
const num = 3482085570325547757;
// Discard all but the highest priority 31 bits
const result = num >>> 33; // Returns 1281508608我认为这可能与GraalJS将数字存储为整型和双精度型的方式有关?我也尝试过使用下面的代码显式强制转换为int,但它也给出了与Java代码不同的结果:
const Long = Java.type('java.lang.Long');
const String = Java.type('java.lang.String');
const BigInteger = Java.type('java.math.BigInteger');
const num = 3482085570325547757;
// Discard all but the highest priority 31 bits
const result = BigInteger.valueOf(num >>> 33).intValue(); // Returns 1281508608发布于 2021-10-19 13:22:31
首先,您的Java示例不能编译。长文字需要L (或l)后缀:
long num = 3482085570325547757L;这样,JavaScript就不能完全准确地存储该数字。
const num = 3482085570325547757;
console.log(num); // Displays 3482085570325547500它可以存储的最大整数是9007199254740991 (Number.MAX_SAFE_INTEGER)。
像这样使用Java的BigInteger是行不通的,因为您在创建BigInteger之前就已经失去了准确性。您需要使用字符串来正确创建BigInteger (或JavaScript的BitInt,或n后缀)。
然而,这也没有真正的帮助,因为>>>在它们上面没有意义。引用Java的BigInteger documentation
无符号右移位运算符(>>>)被省略,因为该操作仅对固定大小的字有意义,而对于概念上具有无限数目的前导虚拟符号位的表示没有意义。
对于JavaScript的BigInt也是如此。
但是,您可以在BigInt中使用普通的右移(>>)运算符
const num = BigInt("3482085570325547757");
const bigIntResult = num >> BigInt(33);
const result = Number(bigIntResult); // Convert to normal number或
const num = 3482085570325547757n;
const bigIntResult = num >> 33n;
const result = Number(bigIntResult); // Convert to normal number或者是Java的BigInteger的shiftRight()方法(未经过测试,因为我没有安装GraalJS ):
const BigInteger = Java.type('java.math.BigInteger');
const num = new BigInteger("3482085570325547757");
const result = num.shiftRight(33).intValue();另请参阅:
https://stackoverflow.com/questions/69630327
复制相似问题