js 移位運算符《《、》》和》》》

這三個運算符,都是用於將十進制數字,轉換爲二進制並通過二進制移位計算後,再轉爲十進制返回結果。

既然要轉二進制,我們就要學習下怎麼將十進制與二進制如何互轉了。這裏是我另一篇博客

這是用到js的方法,但是有時候我們是在面試的時候遇到這種題,那還是要靠自己手算來獲取答案。

二進制轉十進制比較簡單,就是把二進制數字中不爲0的數字的權值相加,下面是一段二進制數字。

1100	// 二進制

// 1、上面,爲1的數字,被稱爲有效數字,爲0的是無效數字,當然這只是在我們的算法中這樣認爲。
// 2、我們要掌握一些權值,有一段數字爲11111,5個1分別對應的權值爲16 8 4 2 1,
// 		可以看出來這是2的平方隨着數字的增加而增加,還可以有更多的權值,但我腦子不好,算不了了。
// 3、用上面我們求出的權值來計算我們取出的2進制數字1100,0爲無效值,只計算1,兩個1對應的權值爲4和8,相加即爲12。
// 4、上面的一段二進制數字轉爲10進制,即爲12。

接下來是把十進制轉換成二進制,利用短除法

12		// 十進制

// 1、12/2 = 6 餘 0  不斷除2,商爲0爲止
// 2、6/2 = 3 餘 0
// 3、3/2 = 1 餘 1
// 4、1/2 = 0 餘 1
// 5、取餘數爲0011,再將餘數倒序爲1100,這個不就是上面的二進制轉10進制給求出來了。

1、<< (有符號運算符)

console.log(5 << 2);  // 返回值20

// 移位運算符是將10進制轉換成32位的二進制數字,然後對其進行操作的。
// 1、求出5的32位二進制數字,先將5裝換成2進製爲101,補齊至32位則是在101前面加上29個0,結果爲  29個0...101。
// 2、32位數從右往左整體移動兩位,移出的去掉,並在數字末尾補零,結果爲 27個0...10100。
// 3、接着,我們從右往左看,把最後一位有效數字之後的無效數字全部去掉,結果爲 10100,再將2進制轉換爲10進制即爲20。
// 這些都是面試要掌握的,實際應用,還真想不出來

2. >> (有符號運算符)

二進制加法

1+1 = 10 進位1
0+0 = 0
1+0 = 1
---------------------------------
1011
+  1
————
1110 
---------------------------------
// 從右看步驟1、1+1 = 10 進1位	0
// 2、 1+進1 = 10 進1位			1
// 3、 0+進1 = 1					1
// 4、 1不加						1
console.log(-5 >> 2);  // 返回值-2

// 負數的算法略微不同
// 1、首先求-5的絕對值,5的32位二進制爲0000 0000 0000 0000 0000 0000 0000 0101
// 2、取反+1,爲1111 1111 1111 1111 1111 1111 1111 1011
// 3、帶符號也就是負數執行移位操作時,移出的去掉,並在數字末尾補1,結果爲
// 			1111 1111 1111 1111 1111 1111 1111 1110
// 4、再僅把最後一個有效值之前的取反,符號位補1,再將二進制結果加1結果爲 
// 			1000 0000 0000 0000 0000 0000 0000 0010,轉換成十進制爲-2

console.log(-8 >> 3)	// -1
// 1、0000 0000 0000 0000 0000 0000 0000 1000
// 2、1111 1111 1111 1111 1111 1111 1111 1111
// 3、1111 1111 1111 1111 1111 1111 1111 1111
// 4、0000 0000 0000 0000 0000 0000 0000 0001  -1

3. >>> (無符號運算符)

無符號運算符,哪怕被運算的是有符號的數字(負數),也會把負數當做其絕對值計算,所以計算的負數可能會特別大。

正整數

console.log(10 >>> 1)	// 5
console.log(10 >> 1)	// 5
// 這個正數的計算方法和有符號運算符>>的結果是一樣的,區別在於負數

負數

console.log(-10 >>> 1)	// 返回值 536870911
// 和第一個有符號運算符的計算方法一致,只不過位移方向不同
// 轉換				1、0000 0000 0000 0000 0000 0000 0000 1010
// 負數取反+1位移,在此位移的需補0而不是補1,而後無需取反+1
// 					2、0111 1111 1111 1111 1111 1111 1111 1011
// 運算 				3、536870911

這裏的運算太複雜,不適合我這種簡單的腦子,
百度了一個轉換工具,點這裏

這個沒什麼用的東西是在寫String的方法時看到的,腦子一熱就想搞懂它,下次可不能這樣了,家中一定常備退燒藥。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章