理解javascript中的按位运算
我目前将数据存储在XML文档中作为二进制文件,长度为20位,每个数字代表一个布尔值。
Resource Title http://www.yoursite.com
我正在使用jQuery解析它,并且我正在使用for
循环和charAt()
来确定如果值为==“1”则是否执行操作。
for (var i = 0; i < _mapLength; i++) { if (map.charAt(i) == "1") { //perform something here } }
这种情况发生了几次,因为HUGE循环运行缓慢。 有人告诉我,我应该使用按位运算符来处理它,它会运行得更快。
我的问题是:
有人能给我一个如何做到这一点的例子吗? 我曾尝试在线阅读教程,但它们似乎正在飞扬我的脑海。 (仅供参考:我打算创建一个Ruby脚本,将我的二进制0和1转换成我的XML中的位。)
或者有没有人知道一个好的,简单的 (甚至可能是愚蠢的版本) 教程或者可以帮助我掌握这些按位运算符概念的东西?
假设您的位数不超过32位,可以使用JavaScript的内置parseInt()
函数将1s和0s的字符串转换为整数,然后使用&
(和)运算符测试标志:
var flags = parseInt("10001010100011110000", 2); // base 2 if ( flags & 0x1 ) { // do something } ...
另请参见: 如何检查我的字节标志?
(问题是关于在C中的使用,但也适用于JS中的相同运算符)
单个&符号(&,而不是&&)进行逐位比较。 但首先,您需要使用parseInt()将字符串转换为数字。
var map = parseInt("10010", 2); // the 2 tells it to treat the string as binary var maskForOperation1 = parseInt("10000", 2); var maskForOperation2 = parseInt("01000", 2); // ... if (map & maskForOperation1) { Operation1(); } if (map & maskForOperation2) { Operation2(); } // ...
要非常小心。 Javascript没有整数 – 数字存储为64位浮点数。 您应该准确转换为52位。 如果你获得了更多的标志,那么当你的“数字”四舍五入到最接近的可表示的浮点数时,就会发生不好的事情。 (哎哟!)
此外,按位操作无助于性能,因为浮点数将转换为整数,经过测试,然后转换回来。
如果你有几个地方要检查标志,我会在一个对象上设置标志,最好是用名字,如下所示:
var flags = {}; flags.use_apples = map.charAt(4); flags.use_bananas = map.charAt(10);
等等…
然后你可以测试循环中的那些标志:
if(flags.use_apples) { do_apple_thing(); }
对象槽测试将比按位检查更快,因为Javascript未针对按位运算符进行优化。 但是,如果你的循环很慢,我担心解码这些标志可能不是缓慢的来源。
按位运算符肯定会更快,但只是线性而不是很多。 你可能会节省几毫秒(除非你在Javascript中处理大量的数据,这无论如何都是一个坏主意)。
您应该考虑在循环中分析其他代码,看看哪些代码的速度最慢。 你还有哪些其他算法,数据结构和分配可以使用重构?