javascript的二進制運算符用於直接對二進制位進行計算,好處是速度快,缺點是不直觀.
位運算符只對整數起作用,如果一個運算子不是整數,則會轉換成整數后再執行;我們都知道javascript的數值都是以64位浮點數的形式儲存的,但是在做位運算的時候,是以32位帶符號的整數進行運算的,並且返回的也是32位帶符號的整數
位運算符主要包括:
- 二進制或運算符(|): 如果兩個符號位都為0,則結果為0,否則為1.
1100 | 0101 返回 1101
- 二進制與運算符(&): 如果兩個符號位都為1,則結果為1,否則為0
1100 & 0101 返回 0100
- 二進制非運算符(~): (一元運算符)取反,二進制位0變1,1變0
~1100 返回 0011
- 二進制異或運算符(^): 若兩個二進制位相同,則結果為0;否則為1
1100 ^ 0101 返回 1001
- 二進制左位移運算符(<<): 相當於乘以2的幾次方
5(十進制) << 3 相當於 5*(2的三次方)
- 二進制右位移運算符(>>): 相當於除以2的幾次方
5(十進制) >> 3 相當於 5/(2的三次方)
- 二進制無符號右位移(>>>): 也叫作頭部補零右位移運算符
// 聲明變量a並賦值為1
var a = 1;
// 利用位運算符返回的是32位帶符號的整數可以將a轉換為32位的整數
a = a | 0;
// 利用這個特性,可以寫出一個將任意值轉為32位整數的函數
function toInt32(x) {
return x | 0;
}
二進制或運算符(or)(符號|)
逐位比較兩個運算子的二進制位,只要有一個是1的就返回1,否則返回0
需要注意的是位運算只對整數有效,如果是小數,則會吧小數部分舍去,只保留整數部分,然后再進行位運算
// 返回-2
-2.9 | 0
二進制與運算符(and)(符號&)
逐位比較兩個運算子的二進制位,只要有一個是0就返回0,否則返回1
// 變為二進制 00 & 11
// 結果為00,返回0
0 & 3
二進制否運算符(not)(符號!)
二進制否運算符將每個二進制位都變為相反值(1變為0,0變為1)
// 5的32位整數二進制形式為00000000000000000000000000000101,
// 否運算后11111111111111111111111111111010,
// 最高位是1表示負數,計算機內部的負數是以補碼的形式來儲存的,
// 所以需要減一取反來計算出源碼00000000000000000000000000000110,十進制形式為6,再加上符號為-6
~5 = -6
- 可以簡單記成一個數與自身的取反值相加,等於-1
- 對一個整數連續兩次二進制否運算,得到它自身
- 所有的位運算都只對整數有效,二進制否運算符遇到小數時也會舍去小數部分,所以我4. 們可以利用這個特性對一個小數連續進行兩次二進制否運算,能達到取整的效果
- 對字符串進行二進制否運算,javascript會先調用Number函數將字符串轉為數值
二進制異或運算符(xor)(符號 ^)
兩個二進制位相同為0,不同為1
異或運算符的運用: 在不使用第三變量的情況下交換兩個變量的值
// a的32位整數二進制表示 00000000000000000000000000001010
// b的32位整數二進制表示 00000000000000000000000000001011
var a = 10;
var b = 11;
// a ^ b 為 00000000000000000000000000000001
a = a ^ b;
// 此時變為 00000000000000000000000000000001 ^ 00000000000000000000000000001011
b = b ^ a;
a = a ^ b;
二進制左位移運算符(Left Shift)(符號<<)
左位移運算符表示將一個數的二進制位值向左移動制定的位數,尾部補0,即乘以2的指定次方.向左移動時,最高位的符號位也是一起移動的
如果左移0位,就相當於將該數值轉為32位整數,等同於取整,對正負數都有效
var color = {r: 100,g: 120,b: 66};
// RGB轉為HEX
// 1 << 24是為了保證結果是6位數
// HEX最多是#加6為數字(16進制),所以最小是000000,最大是ffffff
var rgbToHEX = function(r,g,b){
return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).substr(1);
}
// #647842
rgbToHEX(color.r,color.g,color.b);
補充javascript中的toString()
Array.toString(): 數組的toString()是將數組轉換為一個字符串,並返回
Boolean.toString(): 將boolean轉換為字符串,值是"true"或"false"
Date.toString(): 將日期對象轉換為字符串形式,采用本地時間
Error.toString(): 將錯誤轉換為字符串
Function.toString(): 將函數轉換為字符串
Number.toString(): 將數字轉換為字符串,可以傳入指定的參數,參數表示為是指定進制(范圍是2-36)。例如當參數是2時,返回二進制數
二進制右位移運算符(Right Shift)(符號>>)
右位移運算符(>>)b表示將一個數的二進制形式向右移動指定的位數,如果這個數是整數,頭部補0;如果是負數,頭部補1.(最高位符號位也會跟着移動)
右移運算符相當於除以2的指定次方
頭部補零的右位移運算符
頭部補零的右位移運算符(>>>)與右位移運算符相似,正數時完全一樣,負數時,頭部一律補0,而不考慮符號位.所以該運算符總能得到正值
二進制的開關作用
位運算符可以用來檢測或設置對象屬性的開關,也就是查看或設置二進制形式對應位上的是0(關)或1(開)
& 運算符可以用來檢測當前的設置是否打開了指定的開關
// 二進制形式0101
var flags = 5;
// 二進制形式0100
var FLAG = 4;
// 使用 flags & FLAG檢測flags是否打開了第三個開關
if(flags & FLAG){
console.log('打開了第三個開關');
}