讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議171:使用位操作符執行邏輯運算 >

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

//執行代碼

}


上面代碼中的位掩碼操作非常快,原因前面提到過,因為操作發生在系統底層。對於許多選項保存在一起並經常檢查的情況,位掩碼有助於提高整體性能。