首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript (GraalJS)与Java中的无符号右移>>>

Javascript (GraalJS)与Java中的无符号右移>>>
EN

Stack Overflow用户
提问于 2021-10-19 11:52:33
回答 1查看 63关注 0票数 1

我有以下Java代码:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
const num = 3482085570325547757;
// Discard all but the highest priority 31 bits
const result = num >>> 33; // Returns 1281508608

我认为这可能与GraalJS将数字存储为整型和双精度型的方式有关?我也尝试过使用下面的代码显式强制转换为int,但它也给出了与Java代码不同的结果:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2021-10-19 13:22:31

首先,您的Java示例不能编译。长文字需要L (或l)后缀:

代码语言:javascript
复制
long num = 3482085570325547757L;

这样,JavaScript就不能完全准确地存储该数字。

代码语言: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中使用普通的右移(>>)运算符

代码语言:javascript
复制
const num = BigInt("3482085570325547757");
const bigIntResult = num >> BigInt(33); 
const result = Number(bigIntResult); // Convert to normal number

代码语言:javascript
复制
const num = 3482085570325547757n;
const bigIntResult = num >> 33n; 
const result = Number(bigIntResult); // Convert to normal number

或者是Java的BigIntegershiftRight()方法(未经过测试,因为我没有安装GraalJS ):

代码语言:javascript
复制
const BigInteger = Java.type('java.math.BigInteger');
const num = new BigInteger("3482085570325547757");
const result = num.shiftRight(33).intValue();

另请参阅:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69630327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档