JS位操作符


位運算 NOT
位運算 NOT 由否定號(~)表示,它是 ECMAScript 中為數不多的與二進制算術有關的運算符之一。

位運算 NOT 是三步的處理過程:

1.把運算數轉換成 32 位數字
2.把二進制數轉換成它的二進制反碼
3.把二進制數轉換成浮點數
例如:

var iNum1 = 25;  //25 等於      00000000000000000000000000011001
var iNum2 = ~iNum1; //轉換為 11111111111111111111111111100110
alert(iNum2);  //輸出 "-26"位運算 NOT 實質上是對數字求負,然后減 1,因此 25 變 -26。用下面的方法也可以得到同樣的方法:

var iNum1 = 25;
var iNum2 = -iNum1 -1;
alert(iNum2); //輸出 -26位運算

位運算 AND 
位運算 AND 由和號(&)表示,直接對數字的二進制形式進行運算。它把每個數字中的數位對齊,然后用下面的規則對同一位置上的兩個數位進行 AND 運算:

第一個數字中的數位 第二個數字中的數位 結果 
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。為什么?分析如下:

  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 0001

可以看出,在 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的位運算符會導致代碼的可讀性降低,所以在使用的時候要權衡


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM