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){
//執行代碼
}
上面代碼中的位掩碼操作非常快,原因前面提到過,因為操作發生在系統底層。對於許多選項保存在一起並經常檢查的情況,位掩碼有助於提高整體性能。