Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
移植'&';从Java到Javascript的运算符:溢出问题_Java_Javascript_Numbers_Long Integer - Fatal编程技术网

移植'&';从Java到Javascript的运算符:溢出问题

移植'&';从Java到Javascript的运算符:溢出问题,java,javascript,numbers,long-integer,Java,Javascript,Numbers,Long Integer,考虑以下JAVA语句: System.out.println(3232235776l & 0xFFFFFFFE); 输出为:3232235776 当我在JavaScript中重新编写语句时: console.log(3232235776 & 0xFFFFFFFE); 输出为:-1062731520 Q.有没有办法解决JavaScript中的溢出问题并获得正确的输出? 为了简单起见,我没有发布从Java转换的函数。给你。请假设ipToLong和longToIp在Java和

考虑以下JAVA语句:

System.out.println(3232235776l & 0xFFFFFFFE);
输出为:3232235776


当我在JavaScript中重新编写语句时:

console.log(3232235776 & 0xFFFFFFFE);
输出为:-1062731520


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


为了简单起见,我没有发布从Java转换的函数。给你。请假设
ipToLong
longToIp
在Java和JavaScript中都是可用的黑盒(即,它们在Java和JS中正确地进行ip到long int的转换,反之亦然,经过linted和单元测试)

取自此处:

现在,有人能帮我将下面的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;
}
公共静态列表范围2cidrlist(字符串startIp,字符串endIp){
int[]CIDR2MASK=newint[]{0x00000000,0x8000000,
0xC0000000,0xE0000000,0xF0000000,0xF8000000,0xFC000000,
0xFE000000,0xFF000000,0xFF800000,0xFFC00000,0xFF00000,
0xFFF00000、0xFFF80000、0xFFFC0000、0xFFFE0000、0xFFFF0000、,
0xFFFF8000、0xFFFFC000、0xFFFF000、0xFFFFF000、0xFFFFF800、,
0xFFFFFC00,0xFFFFFE00,0xFFFFFF00,0xFFFFFF80,0xFFFFFFC0,
0xFFFFFF0,0xFFFFF0,0xFFFFFFF8,0xFFFFFFFC,0xFFFFFFFE,
0xFFFFFF
};
长启动=iptolog(startIp);
长端=IPTOLOG(endIp);
ArrayList pairs=新的ArrayList();
while(结束>=开始){
字节maxsize=32;
而(最大尺寸>0){
长掩码=CIDR2掩码[maxsize-1];
长掩码数据库=开始和掩码;
if(maskedBase!=启动){
打破
}
最大尺寸--;
}
double x=Math.log(end-start+1)/Math.log(2);
字节maxdiff=(字节)(32-数学层(x));
如果(最大尺寸
您可以减去它,而不是使用
&
删除所需的位

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

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

您可以减去它,而不是使用
&
删除所需的位

long n = 3232235776L;
System.out.println(n - (n & 1)); // instead of 1 you can use ~0xFFFFFFFE
在您的情况下,这不应该受到溢出的影响

按位运算符将其操作数视为32位(0和1)的序列

从浮点值开始,它将转换为32位值。但是因为它太大了,它会溢出

我建议您尝试以下方法:

var number = 3232235776;
if (number % 2 == 1) {
    number = number - 1;
}
当然,你可以写得更简洁,但也更隐晦:

var number = 3232235776;
number = number - (number % 2);
对于正数和负数,这在语义上应该是等价的

符号分机 在Java中,
0xFFFFFFFE
是一个32位整数,表示
-2
当与long进行ANDing时,它将转换为64位整数:
0xFFFF\u FFFF\u FFFE
,因此所有这一切有效地清除了最后一位,即向下舍入(向下,而不是向零)

我不确定这是否是你想要的。如果是有意的,它可能是而不是我希望在代码库中使用的东西

无信号分机 以下是等效的JavaScript代码,如果您希望在没有符号扩展的情况下实现这一点:

var number = 3232235776;
if (number % 2 == 1) {
    number = number - 1;
}
number = number % 0x100000000; // That's 8 zeroes, i.e. keep the last 4 bytes
按位运算符将其操作数视为32位(0和1)的序列

从浮点值开始,它将转换为32位值。但是因为它太大了,它会溢出

我建议您尝试以下方法:

var number = 3232235776;
if (number % 2 == 1) {
    number = number - 1;
}
当然,你可以写得更简洁,但也更隐晦:

var number = 3232235776;
number = number - (number % 2);
对于正数和负数,这在语义上应该是等价的

符号分机 在Java中,
0xFFFFFFFE
是一个32位整数,表示
-2
当与long进行ANDing时,它将转换为64位整数:
0xFFFF\u FFFF\u FFFE
,因此所有这一切有效地清除了最后一位,即向下舍入(向下,而不是向零)

我不确定这是否是你想要的。如果是有意的,它可能是而不是我希望在代码库中使用的东西

无信号分机 以下是等效的JavaScript代码,如果您希望在没有符号扩展的情况下实现这一点:

var number = 3232235776;
if (number % 2 == 1) {
    number = number - 1;
}
number = number % 0x100000000; // That's 8 zeroes, i.e. keep the last 4 bytes

一些背景:JavaScript没有int或long类型,只有
Number
这是一个64位浮点(类似于double)。问题是,按位操作是通过临时将其转换为32位int并使用它来完成的。我理解这一点,因此我要求解决这一问题。现在,这在JavaScript中真的是不可能的吗?有一些“extende”数学库可用于JavaScript。从语法上讲这是不可能的,但是通过使用这些库中的函数,您可以获得所需的结果。请为其中任何一个链接?或者,为了摆脱掩码,请提供一些背景:JavaScript没有int或long类型,只有
Number
这是一个64位浮点(类似于double)。问题是,按位操作是通过临时将其转换为32位int并使用它来完成的。我理解这一点,因此我要求解决这一问题。现在,这在JavaScript中真的是不可能的吗?有一些“extende”数学库可用于JavaScript。从语法上讲这是不可能的,但通过使用这些库中的函数,您可以获得所需的结果。请为其中任何一个链接?或者,为了摆脱JavaScript中的掩码溢出。您的答案看起来与Java相关。该示例与问题中的示例一样与Java相关,但操作也不应在JavaScript中溢出。
Q.是否存在wa