JS位操做符

位運算 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的位運算符會致使代碼的可讀性下降,因此在使用的時候要權衡

相關文章
相關標籤/搜索