位運算 NOT
位運算 NOT 由否認號(~)表示,它是 ECMAScript 中爲數很少的與二進制算術有關的運算符之一。javascript
位運算 NOT 是三步的處理過程:java
1.把運算數轉換成 32 位數字
2.把二進制數轉換成它的二進制反碼
3.把二進制數轉換成浮點數
例如:spa
var iNum1 = 25; //25 等於 00000000000000000000000000011001
var iNum2 = ~iNum1; //轉換爲 11111111111111111111111111100110
alert(iNum2); //輸出 "-26"位運算 NOT 實質上是對數字求負,而後減 1,所以 25 變 -26。用下面的方法也能夠獲得一樣的方法:code
var iNum1 = 25;
var iNum2 = -iNum1 -1;
alert(iNum2); //輸出 -26位運算blog
位運算 AND
位運算 AND 由和號(&)表示,直接對數字的二進制形式進行運算。它把每一個數字中的數位對齊,而後用下面的規則對同一位置上的兩個數位進行 AND 運算:ip
第一個數字中的數位 第二個數字中的數位 結果
1 1 1
1 0 0
0 1 0
0 0 0開發
例如,要對數字 25 和 3 進行 AND 運算,代碼以下所示:字符串
var iResult = 25 & 3;
alert(iResult); //輸出 "1"25 和 3 進行 AND 運算的結果是 1。爲何?分析以下:io
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
AND = 0000 0000 0000 0000 0000 0000 0000 0001function
能夠看出,在 25 和 3 中,只有一個數位(位 0)存放的都是 1,所以,其餘數位生成的都是 0,因此結果爲 1。
位運算 OR
位運算 OR 由符號(|)表示,也是直接對數字的二進制形式進行運算。在計算每位時,OR 運算符采用下列規則:
第一個數字中的數位 第二個數字中的數位 結果
1 1 1
1 0 1
0 1 1
0 0 0
仍然使用 AND 運算符所用的例子,對 25 和 3 進行 OR 運算,代碼以下:
var iResult = 25 | 3;
alert(iResult); //輸出 "27"25 和 3 進行 OR 運算的結果是 27:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
--------------------------------------------
OR = 0000 0000 0000 0000 0000 0000 0001 1011
能夠看出,在兩個數字中,共有 4 個數位存放的是 1,這些數位被傳遞給結果。二進制代碼 11011 等於 27。
位運算 XOR
位運算 XOR 由符號(^)表示,固然,也是直接對二進制形式進行運算。XOR 不一樣於 OR,當只有一個數位存放的是 1 時,它才返回 1。真值表以下:
第一個數字中的數位 第二個數字中的數位 結果
1 1 0
1 0 1
0 1 1
0 0 0
對 25 和 3 進行 XOR 運算,代碼以下:
var iResult = 25 ^ 3;
alert(iResult); //輸出 "26"25 和 3 進行 XOR 運算的結果是 26:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
XOR = 0000 0000 0000 0000 0000 0000 0001 1010
能夠看出,在兩個數字中,共有 4 個數位存放的是 1,這些數位被傳遞給結果。二進制代碼 11010 等於 26。
左移運算
左移運算由兩個小於號表示(<<)。它把數字中的全部數位向左移動指定的數量。例如,把數字 2(等於二進制中的 10)左移 5 位,結果爲 64(等於二進制中的 1000000):
var iOld = 2; //等於二進制 10
var iNew = iOld << 5; //等於二進制 1000000 十進制 64注意:在左移數位時,數字右邊多出 5 個空位。左移運算用 0 填充這些空位,使結果成爲完整的 32 位數字。
注意:左移運算保留數字的符號位。例如,若是把 -2 左移 5 位,獲得的是 -64,而不是 64。「符號仍然存儲在第 32 位中嗎?」是的,不過這在 ECMAScript 後臺進行,開發者不能直接訪問第 32 個數位。即便輸出二進制字符串形式的負數,顯示的也是負號形式(例如,-2 將顯示 -10。)
有符號右移運算
有符號右移運算符由兩個大於號表示(>>;)。它把 32 位數字中的全部數位總體右移,同時保留該數的符號(正號或負號)。有符號右移運算符剛好與左移運算相反。例如,把 64 右移 5 位,將變爲 2:
var iOld = 64; //等於二進制 1000000
var iNew = iOld >> 5; //等於二進制 10 十進制 2一樣,移動數位後會形成空位。此次,空位位於數字的左側,但位於符號位以後。ECMAScript 用符號位的值填充這些空位,建立完整的數字,以下圖所示:
無符號右移運算
無符號右移運算符由三個大於號(>>>)表示,它將無符號 32 位數的全部數位總體右移。對於正數,無符號右移運算的結果與有符號右移運算同樣。
用有符號右移運算中的例子,把 64 右移 5 位,將變爲 2:
var iOld = 64; //等於二進制 1000000 var iNew = iOld >>>5; //等於二進制 10 十進制 2對於負數,狀況就不一樣了。
無符號右移運算用 0 填充全部空位。對於正數,這與有符號右移運算的操做同樣,而負數則被做爲正數來處理。
因爲無符號右移運算的結果是一個 32 位的正數,因此負數的無符號右移運算獲得的老是一個很是大的數字。例如,若是把 -64 右移 5 位,將獲得 134217726。若是獲得這種結果的呢?
要實現這一點,須要把這個數字轉換成無符號的等價形式(儘管該數字自己仍是有符號的),能夠經過如下代碼得到這種形式:
var iUnsigned64 = -64 >>> 0;
而後,用 Number 類型的 toString() 獲取它的真正的位表示,採用的基爲 2:
alert(iUnsigned64.toString(2));
這將生成 11111111111111111111111111000000,即有符號整數 -64 的二進制補碼錶示,不過它等於無符號整數 4294967232。
出於這種緣由,使用無符號右移運算符要當心。
下經常使用的javascript位運算符的技巧
js位運算來判斷奇偶數
if(n&1===0){ //偶數 }else{ //奇數 }
js位運算符來代替Math.floor
(2.9|0)===2 (~~2.9)===2 (2.9>>>0)===2 (2.9>>0)===2 (2.9<<0)===2 //注意 ~~(-2.999);//= -2 Math.floor(-2.999);// = -3RGB2HEX function RGB2HEX(a,b,c){return"#"+((256+a<<8|b)<<8|c).toString(16).slice(1)}
//或者
function toHexString(r,g,b) { return ("00000" + (r << 16 | g << 8 | b).toString(16)).slice(-6); } var hex = toHexString(red, green, blue);檢測相等關係 if(a!=123) if(a^123) //注意: false ^ 1 // 1 true ^ 1 // 0 2 ^ 1 // 3 {} ^ 1 // 1這個很好用的,好比下面的代碼 var isReady = 0; // somewhere else if( isReady ) { } // somewhere else, set isReady state to 1 isReady ^= 1; // somewhere else, set isReady state to 0 isReady ^= 1;默認值 if (!n) n = defaultValue; n||(n=defaultValue); indexOf和~
在代碼中常使用String.indexOf,例如:
'abc'.indexOf('d')===-1; if('abc'.indexOf(str)!==-1){ //在字符串中 }
咱們能夠這樣來寫
~'abc'.indexOf('d')===0; if(~'abc'.indexOf('d')){ //在字符串中 } if(!~'abc'.indexOf('d')){ //不在字符串中 }
固然javascript的位運算符會致使代碼的可讀性下降,因此在使用的時候要權衡