Javascript中的无符号整数

问题描述 投票:37回答:6

我正在处理一个处理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-21474836481

javascript bit-manipulation unsigned
6个回答
80
投票
document.write( (1 << 31) +"<br/>");

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

唯一使用无符号32位整数的JavaScript运算符是>>>。您可以利用此功能将您一直在使用其他按位运算符的有符号整数转换为无符号整数:

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

同时:

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

无效,因为所有移位操作仅使用移位的最低5位(在JavaScript和其他类似C的语言中也是如此)。 <<32等于<<0,即。没有变化。


9
投票

使用>>>代替>>,以获得无符号的右移,而不是符号扩展的右移。所有其他按位运算符的行为均相同,无论是否对int进行了签名。

涉及到您的代码破坏“当子网...小于2时”。听起来您可能有一些与整数的有符号性无关的错误。


9
投票

Douglas Crockford认为按位运算符是javascript的缺点之一:

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

-Douglas Crockford在“ JavaScript:The Good Parts”中,附录B,按位运算符(添加了重点)

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


6
投票

Javascript没有整数,所有数字实际上都是双精度。

Javascript 1.5 Reference by Mozilla建议一个人只能对32位数字安全地使用按位运算。


4
投票

这里有两个函数可将ipv4地址与javascript中的无符号整数相互转换:

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) );
}

0
投票

您拥有哪种IP地址? IPv4仅使用32位地址,因此JavaScript应该很好(使用double可以给您52bit integer part)。 IPv6使用128位地址,因此您必须使用数组。我的猜测是其他东西坏了。

[[EDIT]建立一个小库,该库使用两个整数的数组作为内部数据类型。

© www.soinside.com 2019 - 2024. All rights reserved.