我正在处理一个处理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
答案 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)
在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>