JavaScript引擎由低级语言构建,在处理过程中它的执行速度是最快的。在JavaScript中,位操作运算符经常被误解,很少被开发者使用,同时经常在布尔表达式中被误用。尽管位操作运算符具有优势,还是会导致在JavaScript开发中不能经常使用它们。
JavaScript中的数字按照IEEE-754标准64位格式存储。在位运算中,数字被转换为有符号32位格式。每种操作均直接在这个32位数上实现结果。尽管需要转换,这个过程与JavaScript中其他数学和布尔运算相比还是非常快的。
如果对数字的二进制表示法不熟悉,那么使用JavaScript可以很容易地将数字转换为字符串形式的二进制表达式,通过调用toString方法传入数字2,例如:
var num1=25,
num2=3;
alert(num1.toString(2));//"11001"
alert(num2.toString(2));//"11"
该表达式消隐了数字高位的零。JavaScript中有4种位逻辑操作符。
❑AND(位与):只有两个操作数的位都是1,结果才是1。
❑OR(位或):有一个操作数的位是1,结果就是1。
❑XOR(位异或):两个操作数的位中只有一个是1,结果才是1。
❑NOT(位非):遇0返回1,遇1返回0。
具体用法如下:
var result1=25&3;//1
alert(result.toString(2));//"1"
var result2=25|3;//27
alert(resul2.toString(2));//"11011"
var result3=25^3;//26
alert(resul3.toString(2));//"11000"
var result=~25;//-26
alert(resul2.toString(2));//"-11010"
有许多方法可以通过位运算符提高JavaScript的速度。首先可以用位运算符替代纯数学操作。例如,通常采用对2取模运算实现颜色交替显示:
for(var i=0,len=rows.length;i<len;i++){
if(i%2){
className="even";
}else{
className="odd";
}
//...
}
在上面代码中,计算某个数对2取模,需要用这个数除以2然后查看余数。对32位数字的底层(二进制)表示法进行分析会发现,偶数的最低位是0,奇数的最低位是1。如果此数为偶数,那么它和1进行位“与”操作的结果就是0;如果此数为奇数,那么它和1进行位“与”操作的结果就是1。也就是说,上面的代码可以重写如下:
for(var i=0,len=rows.length;i<len;i++){
if(i&1){
className="odd";
}else{
className="even";
}
//...
}
虽然代码改动不大,但是位“与”运算的速度比原始代码提升了约50%。
将使用位操作的技术称为位掩码。位掩码在计算机科学中是一种常用的技术,可用于同时判断多个布尔选项,快速地将数字转换为布尔标志数组。掩码中每个选项的值都是2的幂。例如:
var OPTION_A=1;
var OPTION_B=2;
var OPTION_C=4;
var OPTION_D=8;
var OPTION_E=16;
通过定义这些选项,可以用位“或”操作创建一个数字来包含多个选项:
var options=OPTION_A|OPTION_C|OPTION_D;
使用位“与”操作检查一个给定的选项是否可用。如果该选项未设置,那么运算结果为0;如果设置了该选项,那么运算结果为1。
if(options&OPTION_A){
//执行代码
}
if(options&OPTION_B){
//执行代码
}
上面代码中的位掩码操作非常快,原因前面提到过,因为操作发生在系统底层。对于许多选项保存在一起并经常检查的情况,位掩码有助于提高整体性能。