我目前将数据存储在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中的位。)
或者有没有人知道一个好的,简单的(可能甚至是愚蠢的版本)教程还是可以帮助我掌握这些按位运算符概念的东西?
答案 0 :(得分:13)
假设您的位数不超过32位,可以使用JavaScript的内置parseInt()
函数将1和0的字符串转换为整数,然后使用&
测试标志(和)运营商:
var flags = parseInt("10001010100011110000", 2); // base 2
if ( flags & 0x1 )
{
// do something
}
...
(问题是在C中使用,但也适用于JS中的相同运算符)
答案 1 :(得分:3)
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中处理大量数据,这无论如何都是一个坏主意)。
您应该考虑在循环中分析其他代码,看看哪些代码的速度最慢。您还有哪些其他算法,数据结构和分配可以使用重构?