我的工作是处理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

有帮助吗?

解决方案

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

<<操作者被定义为符号的32位整数(从双精度浮点的天然数存储转换)工作。所以1<<31必须导致一个负数。

在只有JavaScript操作者使用无符号的32位整数,工程是>>>。你可以利用这个转换有符号整数合数,你一直在努力与其他位运算符无符号整数,在号码:

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

同时

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

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

其他提示

使用>>>代替>>得到一个无符号右移位,而不是一个一个符号扩展。所有其他位运算符行为相同的方式而不管是否整数签署或没有。

您的代码打破“当子网...小于2”有关。这听起来像是你可能有一些不相关的错误,以符号性的整数。

道格拉斯Crockford的认为,位运算符是的javascript的坏的部分之一:

  

在Java中,按位运算符与整数的工作。 JavaScript没有整数。它只有双精度浮点数。因此,位运算符将它们的多个操作数为整数,做好自己的业务,然后将其转换回。在大多数语言中,这些运营商都非常接近硬件和速度非常快。的在JavaScript中,它们是从硬件很远和非常慢。 JavaScript是很少用于做位操作。

     

- 道格拉斯克罗克福德在 “JavaScript的:好零件”,附录B,位运算符(强调)

您确定位运算符真正加快你的逻辑是什么?

JavaScript没有整数,所有的数字实际上是双打。

的Javascript 1.5参考由Mozilla 表明,一次只能用按位操作安全地为32位的数字。

下面是转换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) );
}

你有什么样的IP地址? IPv4使用32位的唯一地址,所以JavaScript的应该是罚款(采用双它给你一个 52bit整数部分)。 IPv6使用128位地址,所以你必须使用一个数组。我的猜测是其他什么东西坏了。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top