gpt4 book ai didi

java - 将 '&' 运算符从 Java 移植到 Javascript : Overflow issues

转载 作者:行者123 更新时间:2023-11-28 16:11:37 25 4
gpt4 key购买 nike

考虑以下JAVA语句:

System.out.println(3232235776l & 0xFFFFFFFE);

输出为:3232235776

<小时/>

当我用 JavaScript 重写语句时:

console.log(3232235776 & 0xFFFFFFFE);

输出为:-1062731520


问。有没有办法解决 JavaScript 中的这种溢出问题并获得正确的输出?

<小时/>

为了简单起见,我没有发布从 Java 转换的函数。这里是。请假设 ipToLonglongToIp 在 Java 和 JavaScript 中都是工作黑盒(即,在 Java 和 JS 中,它们正确地进行 ip 到 long int 的转换,反之亦然,已检查并经过单元测试)。

取自此处:https://stackoverflow.com/a/5032908/504674

现在,有人可以帮我将下面的 Java 行正确转换为 JavaScript 吗?
具体来说:long maskedBase = start & mask;

要转换的完整函数:

public static List<String> range2cidrlist( String startIp, String endIp ) {
int[] CIDR2MASK = new int[] { 0x00000000, 0x80000000,
0xC0000000, 0xE0000000, 0xF0000000, 0xF8000000, 0xFC000000,
0xFE000000, 0xFF000000, 0xFF800000, 0xFFC00000, 0xFFE00000,
0xFFF00000, 0xFFF80000, 0xFFFC0000, 0xFFFE0000, 0xFFFF0000,
0xFFFF8000, 0xFFFFC000, 0xFFFFE000, 0xFFFFF000, 0xFFFFF800,
0xFFFFFC00, 0xFFFFFE00, 0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0,
0xFFFFFFE0, 0xFFFFFFF0, 0xFFFFFFF8, 0xFFFFFFFC, 0xFFFFFFFE,
0xFFFFFFFF
};

long start = ipToLong(startIp);
long end = ipToLong(endIp);

ArrayList<String> pairs = new ArrayList<String>();
while ( end >= start ) {
byte maxsize = 32;
while ( maxsize > 0) {
long mask = CIDR2MASK[maxsize -1];
long maskedBase = start & mask;

if ( maskedBase != start ) {
break;
}

maxsize--;
}
double x = Math.log( end - start + 1) / Math.log( 2 );
byte maxdiff = (byte)( 32 - Math.floor( x ) );
if ( maxsize < maxdiff) {
maxsize = maxdiff;
}
String ip = longToIp(start);
pairs.add( ip + "/" + maxsize);
start += Math.pow( 2, (32 - maxsize) );
}
return pairs;
}

最佳答案

您可以减去它,而不是使用 & 来删除您想要的位。

long n = 3232235776L;
System.out.println(n - (n & 1)); // instead of 1 you can use ~0xFFFFFFFE

在您的情况下,这不应该受到溢出的影响。

关于java - 将 '&' 运算符从 Java 移植到 Javascript : Overflow issues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12726028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com