理解javascript中的按位运算

时间:2009-06-16 20:51:26

标签: javascript jquery binary compare bit-manipulation

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

<matrix> 

    <resource type="single"> 
        <map>10001010100011110000</map> 
        <name>Resource Title</name> 
        <url>http://www.yoursite.com</url> 
    </resource>

</matrix>

我正在使用jQuery解析此问题,目前我正在使用for循环和charAt()来确定当值为==“1”时是否执行操作。

for (var i = 0; i < _mapLength; i++) {
    if (map.charAt(i) == "1") {
        //perform something here
    }
}

这种情况发生了几次,因为HUGE循环运行缓慢。有人告诉我,我应该使用按位运算符来处理它,它会运行得更快。

我的问题是:

有人能为我提供一个如何做到这一点的例子吗?我试图在线阅读教程,他们似乎正在飞扬我的头脑。 (仅供参考:我打算创建一个Ruby脚本,将我的二进制0和1转换成我的XML中的位。)

或者有没有人知道一个好的,简单的(可能甚至是愚蠢的版本)教程还是可以帮助我掌握这些按位运算符概念的东西?

4 个答案:

答案 0 :(得分:13)

假设您的位数不超过32位,可以使用JavaScript的内置parseInt()函数将1和0的字符串转换为整数,然后使用&测试标志(和)运营商:

var flags = parseInt("10001010100011110000", 2); // base 2

if ( flags & 0x1 )
{
   // do something
}

...

另见:How to check my byte flag?

(问题是在C中使用,但也适用于JS中的相同运算符)

答案 1 :(得分:3)

单个&符号(&amp ;,而不是&amp;&amp;)进行逐位比较。但首先你需要使用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(); }
// ...

答案 2 :(得分:3)

非常谨慎。 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未针对按位运算符进行优化。但是,如果你的循环很慢,我担心解码这些标志可能不是缓慢的来源。

答案 3 :(得分:1)

按位运算符肯定会更快,但只是线性而不是很多。你可能会节省几毫秒(除非你在Javascript中处理大量数据,这无论如何都是一个坏主意)。

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