js正數轉負數的函數?為什麼要做js位運算呢?ECMAScript 整數有兩種類型,即:,接下來我們就來聊聊關于js正數轉負數的函數?以下内容大家不妨參考一二希望能幫到您!
為什麼要做js位運算呢?
ECMAScript 整數有兩種類型,即:
有符号整數使用 31 位表示整數的數值,用第 32 位表示整數的符号,0 表示正數,1 表示負數。
數值範圍從 -2147483647 到 2147483647。
位運算會把二進制數限制在32位,超出部分會被舍棄
轉換成2進制字符串
var a = 1732584193;a.toString(2); // 1100111010001010010001100000001
parseInt(‘11001’, 2)
将2進制字符串轉換成10進制數
parseInt('11001', 2) // 25
padStart(32, ‘0’)
字符串總長度,左邊不足位數補0
'1100000001'.padStart(32, 0) // 00000000000000000000001100000001
源碼、反碼、補碼
源碼
将數字轉換成的2進制數, 最左邊表示符号位,1負數,0正數
5 源碼: 0101-10 源碼:11010
反碼
正數的反碼與其原碼相同
負數的反碼,除符号位外,其他位取反
5 源碼:0101反碼:0101-10源碼:11010 反碼:10101
補碼
正整數的補碼與其原碼相同
負整數的補碼,取反碼+1
5源碼:0101補碼:0101-10源碼:11010補碼:10110
ok,現在開始正題
位運算符
運算步驟:
~25 // -26
過程:
~1 // -2~-1 // 0~100 // -101~-100 // 99
位運算符:與(&)
運算步驟:
- 把兩個數轉換成2進制補碼
- 相同位置進行比較(同為1,結果為1,否則為0)
- 如果計算結果是負數,還要再做補碼處理
如果位數不夠,正數左邊補0,負數補1
正正運算
10 & 3 // 2
過程:
14 & -13 // 2
過程:
88 & -19 // 72
過程:
-12 & -5 // -16
過程:
3 & 7-21 & 16-271733879 & -17325841941125899778533470 & 81293020 & 0xF48192342 & 0xFFFF
位運算符:或(|)
運算步驟:
- 把兩個數字轉換成2進制補碼
- 相同位置進行比較(有一個是1,結果即為1)
- 如果計算結果是負數,還要再做補碼處理
正正運算
10 | 3 // 11
過程:
10 | -3 // -1
過程:
-15 | -21 // -5
過程:
15 | 2040 | -14-271733879 | 1732584193(-271733879 & -1732584194) | (~-271733879 & 271733878)
位運算符:異或(^)
運算步驟:
- 把兩個數轉換成2進制補碼
- 相同位置進行比較(必須是0和1或者1和0,結果才為1)
- 如果結果為負,再取補碼
正正異或
10 ^ 3 // 9
過程:
10 ^ -3 // -9
過程:
-10 ^ -3 // 11
過程:
5 ^ 8-10 ^ 9-13 ^ -20-271733879 ^ -1732584194 ^ 271733878
位運算符:帶符号左移(<<)
運算步驟:
- 把數字轉換成2進制補碼
- 左移指定位數,右邊補0
- 如果結果未負數,再取補碼
超過32位的部分舍棄
正數左移
1 << 2 // 補碼:00000001 左移2位, 即 00000100,結果為:45 << 3 // 補碼:00000101 左移3位, 即 00101000,結果為:40
可以看出,正數帶符号左移,即 a << n,其實是 a * 2的n次幂
負數左移
-3 << 4
-6 << 3 // 1010 << 3 等于 1010000,取補碼,1110000 即:-48-11 << 4 // 10101 << 4 等于 101010000,取補碼,110110000 即:-176
邊緣情況
情況1:正數變負數
1732584193 << 2 // -1659597820
計算過程
-1732584193 << 2 // 1659597820
計算過程
1 << 32 1 << 33 1 << 402147483648 << 21732584193 << 6
位運算符:帶符号右移(>>)
運算步驟:
- 取數字二進制補碼
- 右移指定位數,左邊補位與符号位一緻
- 多餘位被舍棄
- 如果計算結果為負,再取補碼
正數右移
5 >> 1 // 0101 右移1位 0010,即 21 >> 2 // 0001 右移1位 0000,即 0
正數右移比較簡單,移出的内容直接舍棄即可,左邊用0補充
負數右移
-5 >> 2 // -2
分析:
5 + 64 >> 91732584193 >> 4
位運算符:無符号右移(>>>)
運算步驟:
- 把數字轉換成32位2進制補碼
- 連同符号位,右移動指定的位數
- 向右被移出的位被丢棄,左側用0填充
因為符号位變成了 0,所以結果總是正的
正數右移
正數時候 >> 和 >>> 結果是一樣的
5 >> 2 // 101 右移2位 001 即:15 >>> 2 // 101 右移2位 001 即:1
負數右移
-5 >>> 2 // 1073741822
過程:
問題:為什麼這個要補滿32位,而之前的運算都沒有?
因為之前的運算,正數補的都是0,負數雖然補1,但計算後要做補碼,補位的數最終不影響計算
而無符号右移,則會影響運算。所以需要補全
-23 >>> 245678765 >>> 31
關于位運算的核心思路
以上内容都是個人收集、以及多次嘗試整理的。
因為網上看到的很多文章計算方式都不對,雖然舉的例子沒問題,但換機組數字就計算錯誤。
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!