Javascript中的无符号整数

时间:2009-12-15 16:07:35

标签: javascript bit-manipulation unsigned

我正在处理一个处理IP地址信息的页面,但它正在扼杀整数已签名的事实。我使用按位运算符来加速它,但第64位(有符号/无符号标志)正在弄乱它。

有没有办法强制数字在Javascript中无符号?它似乎工作正常,直到子网大于30或小于2.

试试这个:

<html>
<body>

<script type='text/javascript'>
document.write( (1 << 30) +"<br/>");
document.write( (1 << 31) +"<br/>");
document.write( (1 << 32) +"<br/>");
</script>

</body>
</html>

结果:

  

1073741824   -2147483648   1

7 个答案:

答案 0 :(得分:78)

document.write( (1 << 31) +"<br/>");

<<运算符被定义为处理带符号的32位整数(从双精度浮点数的本机数存储转换)。因此1<<31必须产生负数。

使用无符号32位整数的唯一JavaScript运算符是>>>。您可以利用它将您正在使用的其他按位运算符中的signed-in-Number转换为无符号整数的数字:

document.write(( (1<<31)>>>0 )+'<br />');

同时

document.write( (1 << 32) +"<br/>");

不起作用,因为所有移位操作仅使用最低5位移位(在JavaScript和其他类C语言中)。 <<32等于<<0,即。没有变化。

答案 1 :(得分:9)

使用&gt;&gt;&gt;而不是&gt;&gt;获得无符号右移而不是符号扩展。无论是否有符号,所有其他按位运算符的行为方式都相同。

您的代码打破“当子网...小于2”时有关。听起来你可能有一些与整数签名无关的错误。

答案 2 :(得分:9)

道格拉斯·克罗克福德认为,按位运算符是javascript中不好的部分之一:

  

在Java中,按位运算符使用整数。 JavaScript没有整数。它只有双精度浮点数。因此,按位运算符将其操作数转换为整数,执行其业务,然后将其转换回来。在大多数语言中,这些运算符非常接近硬件并且速度非常快。 在JavaScript中,它们距离硬件非常远,而且非常慢。 JavaScript很少用于进行位操作。

     

- Douglas Crockford在“JavaScript:The Good Parts”,附录B,Bitwise Operators(重点补充)

你确定按位运算符真的可以加速你的逻辑吗?

答案 3 :(得分:6)

Javascript没有整数,所有数字实际上都是双倍的。

Javascript 1.5 Reference by Mozilla表明只能对32位数字安全地使用按位运算。

答案 4 :(得分:3)

以下是在javascript中将ipv4地址转换为无符号整数的两个函数:

function ip2long(ip) {
    var ipl=0;
    ip.split('.').forEach(function( octet ) {
        ipl<<=8;
        ipl+=parseInt(octet);
    });
    return(ipl >>>0);
}

function long2ip (ipl) {
    return ( (ipl>>>24) +'.' +
        (ipl>>16 & 255) +'.' +
        (ipl>>8 & 255) +'.' +
        (ipl & 255) );
}

答案 5 :(得分:0)

您拥有哪种IP地址? IPv4只使用32位地址,因此JavaScript应该没问题(使用double可以得到52bit integer part)。 IPv6使用128位地址,因此您必须使用数组。我的猜测是其他东西被打破了。

[编辑]构建一个小型库,它使用两个整数的数组作为内部数据类型。

答案 6 :(得分:0)

Javascript 现在有 bigint 类型,您可以使用 n 后缀来生成这样的数字。

因此,使用您的示例,您可以:

<body>
    
    <script type='text/javascript'>
    document.write( (1n << 30n) +"<br/>");
    document.write( (1n << 31n) +"<br/>");
    document.write( (1n << 32n) +"<br/>");
    </script>
    
    </body>
</html>