首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议171:使用位操作符执行逻辑运算

关灯直达底部

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){

//执行代码

}


上面代码中的位掩码操作非常快,原因前面提到过,因为操作发生在系统底层。对于许多选项保存在一起并经常检查的情况,位掩码有助于提高整体性能。