摘要:位與真真為真,其余為假和二進制位與運算由于奇數(shù)的二進制末位為,偶數(shù)為,跟的位與運算后,分別為和,因此可以用位與運算來判斷奇偶數(shù)。為奇數(shù)為偶數(shù)位或假假為假,其余為真和二進制位或運算整數(shù)與的位或運算,都是本身。
前言
在平常的工作中位運算用得比較少,一般用其他更容易理解得方式去達到相同目的。在計算機內(nèi)部,一切運算最終都轉(zhuǎn)化成二級制運算,直接使用二級制運算執(zhí)行得效率是最高的。偶爾看到一道面試題,復習一下這方面知識,先來看一下這道面試題:
var a = 10; a ^= (1<<4) - 1; a的值
題目先放一放,看看js中有哪些位運算。
1. 位與(&)真真為真,其余為假
9和10二進制位與運算 1001 & 1010 ------- 1000
由于奇數(shù)的二進制末位為1,偶數(shù)為0,跟1的位與運算后,分別為1和0,因此可以用位與運算來判斷奇偶數(shù)。
if(n & 1) { console.log("n為奇數(shù)"); } else { console.log("n為偶數(shù)"); }2. 位或(|)
假假為假,其余為真
9和10二進制位或運算 1001 | 1010 ------- 1011
整數(shù)與0的位或運算,都是本身。浮點數(shù)不支持位運算,過程中會自動轉(zhuǎn)化成整數(shù),利用這一點,可以將浮點數(shù)與0進行位或運算即可達到取整目的。
console.log(15.22 | 0); // 153. 位非(~)
真為假,假為真
9二進制位非運算 ~ 0000000000000000 0000000000001001 -------取反 1111111111111111 1111111111110110 -------符號位不變,其余取反 1000000000000000 0000000000001001 -------加1 1000000000000000 0000000000001010
按位非操作,首先每一位取反,然后,第一位為負數(shù)符號位保持不變,剩余取反加1就是最后結(jié)果。
4. 異或(^)相同為假,不同為真
9和10二進制異或運算 1001 | 1010 ------- 0011
可以用于交換兩個整數(shù)的值,不過一般很少這么用
var a = 3, b = 5; a ^= b; b ^= a; a ^= b; console.log("a:", a); // 5 console.log("b:", b); // a5. 有符號左移(<<)
首位符號為不動,把32位二進制數(shù)字整體往左邊移動指定位數(shù),左邊超出部分被舍去,右邊補0。
9二進制有符號左移5位 9<<5 0000000000000000 0000000000001001 ------ 0000000000000000 0000000100100000
計算機內(nèi)是這樣位移計算的,實際應用計算我們可以通過公式:num * (2^n),即:9*Math.pow(2,5)
6. 有符號右移(>>)首位符號為不動,把32位二進制數(shù)字整體往右邊移動指定位數(shù),右邊超出部分被舍去,左邊補0。
288二進制有符號右移5位 9>>5 0000000000000000 0000000100100000 ------ 0000000000000000 0000000000001001
計算機內(nèi)是這樣位移計算的,實際應用計算我們可以通過公式:num / (2^n),即:288/Math.pow(2,5)
7. 無符號右移(>>>)符號為也跟著一起移動,這樣,無符號右移會把負數(shù)的二進制當成整數(shù)的二進制碼
4294967296二進制無有符號右移5位 4294967296>>>5 1000000000000000 0000000000000000 ------ 0000010000000000 0000000000000000回歸面試題
var a = 10; a ^= (1<<4) - 1;
1<<4左移4位,即1*Math.pow(2, 4) == 16,則a ^= 15
10和15的異或運算 1111 ^ 1010 ......... 0101
0101二進制表示5,所以a的值位5
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93266.html
摘要:原碼補碼和反碼原碼一個數(shù)在計算機中是以二進制的形式存在的,其中第一位存放符號正數(shù)為負數(shù)為。中的位運算在中按位操作符會將其操作數(shù)轉(zhuǎn)成補碼形式的有符號位整數(shù)。原文鏈接由扯到中的位運算 這個話題的由來是2016年3月份的時候 NPM 社區(qū)發(fā)生了‘left-pad’事件,不久后社區(qū)就有人發(fā)布了用來補救的,也是現(xiàn)在大家能用到的 left-pad 庫。 最開始這個庫的代碼是這樣的。 module....
摘要:雖然在內(nèi)部,數(shù)值都是以位浮點數(shù)的形式儲存,但是做位運算的時候,是以位帶符號的整數(shù)進行運算的,并且返回值也是一個位帶符號的整數(shù)。如下表應用場景取整對于一般的整數(shù),返回值不會有任何變化。例如,結(jié)果為負數(shù)存儲采用的形式是二進制補碼。 什么是位運算? 位運算是在數(shù)字底層(即表示數(shù)字的 32 個數(shù)位)進行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...
摘要:雖然在內(nèi)部,數(shù)值都是以位浮點數(shù)的形式儲存,但是做位運算的時候,是以位帶符號的整數(shù)進行運算的,并且返回值也是一個位帶符號的整數(shù)。如下表應用場景取整對于一般的整數(shù),返回值不會有任何變化。例如,結(jié)果為負數(shù)存儲采用的形式是二進制補碼。 什么是位運算? 位運算是在數(shù)字底層(即表示數(shù)字的 32 個數(shù)位)進行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...
摘要:雖然在內(nèi)部,數(shù)值都是以位浮點數(shù)的形式儲存,但是做位運算的時候,是以位帶符號的整數(shù)進行運算的,并且返回值也是一個位帶符號的整數(shù)。如下表應用場景取整對于一般的整數(shù),返回值不會有任何變化。例如,結(jié)果為負數(shù)存儲采用的形式是二進制補碼。 什么是位運算? 位運算是在數(shù)字底層(即表示數(shù)字的 32 個數(shù)位)進行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...
閱讀 3591·2021-11-24 10:19
閱讀 3730·2021-09-30 09:47
閱讀 1293·2019-08-30 15:56
閱讀 791·2019-08-29 15:11
閱讀 905·2019-08-29 13:43
閱讀 3570·2019-08-28 18:25
閱讀 2161·2019-08-26 13:27
閱讀 1439·2019-08-26 11:44