理解javascript中的按位运算

我目前将数据存储在XML文档中作为二进制文件,长度为20位,每个数字代表一个布尔值。

  10001010100011110000 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中处理大量的数据,这无论如何都是一个坏主意)。

您应该考虑在循环中分析其他代码,看看哪些代码的速度最慢。 你还有哪些其他算法,数据结构和分配可以使用重构?