js位運算子

2021-08-18 03:45:06 字數 3503 閱讀 6393

我們可能很少在程式設計中用位運算,如果沒深入學習,可能也很難理解。平時的數值運算,其實是要先轉換成二進位制再進行運算的,而位運算就是直接進行二進位制運算,所以位運算的執行效率肯定是更高的。下面通過一些例項來加深對位運算的理解。

&&運算子我們都知道,只有兩個都為真,結果才為真。&道理是一樣的,只有兩個數的值為1時,才返回1。例如1和3的按位與操作:

0001

& 0011

---------

0001

只有對應的數為1時,結果才為1,其他都為0。

判斷乙個數是奇數還是偶數,我們會用求餘數來判斷:

function

assert(n) else

}assert(3); // "n是奇數"

我們也可以用乙個數和1進行按位&操作來判斷,而且速度更快:

function

assert(n) else

}assert(3); // "n是奇數"

下面是位運算過程:

1 = 0001

3 = 0011

--------

& = 0001

奇數的二進位製碼的最後一位數肯定是1,而1只有最後一位為1,按位&操作之後,結果肯定只有最後一位數為1。而偶數的二進位制表示的最後一位數是0,和1進行按位&操作,結果所有位數都為0。

|與||操作符的道理也是一樣的,只要兩個數中有乙個數為1,結果就為1,其他則為0。

0001

| 0011

---------

0011

對浮點數向下求整,我們會用下面的方法:

var num = math.floor(1.1); // 1
我們也可以用位運算來求整:

var num = 1.1 | 0; // 1
其實浮點數是不支援位運算的,所以會先把1.1轉成整數1再進行位運算,就好像是對浮點數向下求整。所以1|0的結果就是1。

按位非就是求二進位制的反碼:

var num = 1; // 二進位制 00000000000000000000000000000001

var num1 = ~num; // 二進位制 11111111111111111111111111111110

我們知道,js中的數字預設是有符號的。有符號的32位二進位制的最高位也就是第一位數字代表著正負,1代表負數,0代表整數。那到底11111111111111111111111111111110等於多少呢?最高位為1代表負數,負數的二進位制轉化為十進位制:符號位不變,其他位取反加1。取反之後為10000000000000000000000000000001,加1之後為10000000000000000000000000000010,十進位制為-2。

按位異或是兩個數中只有乙個1時返回1,其他情況返回0。(相同時返回0,不同時返回1)

0001

^ 0011

---------

0010

數字與數字本身按位異或操作得到的是0,因為每兩個對應的數字都相同,所以最後返回的都是0。

我們經常會需要調換兩個數字的值:

var num1 = 1, num2 = 2, temp;

temp = num1;

num1 = num2; // 2

num2 = temp; // 1

如果裝逼一點的話,可以這樣:

var num1 = 1, num2 = 2;

num1 = [num2, num2 = num1][0];

console.log(num1); // 2

console.log(num2); // 1

如果想再裝的穩一點的話,可以這樣:

var num1 = 1, num2 = 2;

num1 ^= num2; // num1 = num1 ^ num2 = 1 ^ 2 = 3

num2 ^= num1; // num2 = num2 ^ (num1 ^ num2) = 2 ^ (1 ^ 2) = 1

num1 ^= num2; // num1 = num1 ^ num2 = 3 ^ 1 = 2

console.log(num1); // 2

console.log(num2); // 1

有符號左移會將32位二進位制數的所有位向左移動指定位數。如:

var num = 2; // 二進位制10

num = num << 5; // 二進位制1000000,十進位制64

如果要求2的n次方,可以這樣:

function

power

(n)power

(5);

// 32

1的二進位制是01,左移5位就是0100000,十進位制就是2的5次方32。

有符號右移會將32位二進位制數的所有位向右移動指定位數。如:

var num = 64; // 二進位制1000000

num = num >>

5; // 二進位制10,十進位制2

求乙個數的二分之一:

var num = 64

>>

1; //

32

有符號左移與右移不會影響符號位。

正數的無符號右移與有符號右移結果是一樣的。負數的無符號右移會把符號位也一起移動,而且無符號右移會把負數的二進位製碼當成正數的二進位製碼:

(result = expression1 >>> expression2

其中result是任何變數。 

expression1是任何表示式。 

expression2是任何表示式。

>>> 運算子把 expression1 的各個位向右移 expression2 指定的位數。右移後左邊空出的位用零來填充。移出右邊的位被丟棄)

var num = -64; //

11111111111111111111111111000000

num = num >>>

5; //

134217726

所以,我們可以利用無符號右移來判斷乙個數的正負:

function

ispos(n)

ispos(-1); // false

ispos(1); // true

-1>>>0雖然沒有向右移動位數,但-1的二進位製碼已經變成了正數的二進位製碼:

11111111111111111111111111111111
所以-1>>>0的值為4294967295。

JS 位運算子

在js中有 等位運算子。在對乙個數值使用位運算子時,js會先將數值轉換為二進位制,然後進行位運算。在js中對乙個數值轉進行二進位制轉換,會得到乙個長度為32位的二進位制數,通常第乙個為1的位之前所有為0的為在表示時可以省略。常見位運算子使用方法有下列幾種 非,a 即 將a的二進位製碼的每一位 32位...

js左移運算子 ECMAScript 位運算子

重溫整數 ecmascript 整數有兩種型別,即有符號整數 允許用正數和負數 和無符號整數 只允許用正數 在 ecmascript 中,所有整數字面量預設都是有符號整數,這意味著什麼呢?有符號整數使用 31 位表示整數的數值,用第 32 位表示整數的符號,0 表示正數,1 表示負數。數值範圍從 2...

位運算子,「,」逗號運算子,

位運算子有 按位與 按位或 按位異或 按位取反 優先順序從高到低,依次為 按位與運算有兩種典型用法,一是取乙個位串資訊的某幾位,如以下 擷取x的最低7位 x 0177。二是讓某變數保留某幾位,其餘位置0,如以下 讓x只保留最低6位 x x 077。按位或運算的典型用法是將乙個位串資訊的某幾位置為1。...