我正在处理一个处理IP地址信息的页面,但它正在扼杀整数已签名的事实.我使用按位运算符来加速它,但第64位(有符号/无符号标志)正在弄乱它.
有没有办法强制数字在Javascript中无符号?它似乎工作正常,直到子网大于30或小于2.
试试这个:
结果:
1073741824 -2147483648 1
bobince.. 78
document.write( (1 << 31) +"
");
的<<
操作者被定义为符号的32位整数(从双精度浮点的天然数存储转换)工作.所以1<<31
必须导致负数.
使用无符号32位整数的唯一JavaScript运算符是>>>
.您可以利用它将您正在使用其他位运算符的已编号的有符号整数转换为无符号整数的数字:
document.write(( (1<<31)>>>0 )+'
');
与此同时:
document.write( (1 << 32) +"
");
因为所有的移位操作只使用最低的5位移位(在JavaScript和其他类似C语言中),所以不会起作用.<<32
等于<<0
,即.没变.
document.write( (1 << 31) +"
");
的<<
操作者被定义为符号的32位整数(从双精度浮点的天然数存储转换)工作.所以1<<31
必须导致负数.
使用无符号32位整数的唯一JavaScript运算符是>>>
.您可以利用它将您正在使用其他位运算符的已编号的有符号整数转换为无符号整数的数字:
document.write(( (1<<31)>>>0 )+'
');
与此同时:
document.write( (1 << 32) +"
");
因为所有的移位操作只使用最低的5位移位(在JavaScript和其他类似C语言中),所以不会起作用.<<32
等于<<0
,即.没变.
使用>>>代替>>来获得无符号右移而不是符号扩展.无论int是否有符号,所有其他按位运算符的行为方式都相同.
您的代码打破"当子网...小于2"时有关.听起来你可能有一些与整数签名无关的错误.
Douglas Crockford认为按位运算符是javascript的坏处之一:
在Java中,按位运算符使用整数.JavaScript没有整数.它只有双精度浮点数.因此,按位运算符将其操作数转换为整数,执行其业务,然后将其转换回来.在大多数语言中,这些运算符非常接近硬件并且速度非常快.在JavaScript中,它们离硬件很远,而且非常慢.JavaScript很少用于进行位操作.
- 道格拉斯·克罗克福德在"JavaScript:好的部分",附录B,按位运算符(重点补充)
你确定按位运算符真的能加速你的逻辑吗?
Javascript没有整数,所有数字实际上都是双精度数.
Mozilla的Javascript 1.5参考建议人们只能对32位数字安全地使用按位运算.