JS中的按位非運算符是~,做用是將每位二進制取反內存
十進制2的二進制表示爲:基礎
0000,0010二進制
每位都取反:方法
1111,1101運算符
這是內存中的保存形式。
咱們讀取的十進制是根據原碼來讀取,而在內存中,數值都是以二進制補碼形式保存的。
正數的補碼和原碼同樣,負數的原碼轉補碼或者補碼轉原碼的規則:
符號位不變,將剩餘位取反,獲得反碼,在反碼的基礎上最後一位加一獲得負數的補碼。
1111,1101輸出10進制的過程:
1.符號位不變,剩餘位取反
1000,0010
2.最後一位加1
1000,0011
3.得的結果1000,0011就是-3的原碼形式
~(1) = -2
~(2) = -3
~(3) = -4
~(2018) = -2019
假設A爲正數,~(A)結果爲B。B是A的每位去反的結果,包括符號位0也取反變成了1。那麼B就被當作負數保存在內存中。顯示十進制數時,B除符號位外都取反,獲得C,C和A的區別在於符號位不一樣,其餘位都同樣,而後C的最後一位加1獲得最終結果D。D和A相比,除符號位不一樣外,還大一。
假設A爲負數,~(A)結果爲B。B是A的每位取反的結果,符號位從1變成0。那麼B被當作正數保存在內存中。A做爲負數,在內存中保存的是補碼,假設A的原碼是C,補碼就是C除符號位,每位取反加一。B就是A的補碼包括符號位每位取反,不看符號位的變化的話,也就是C取反加一的基礎上再次取反,結果就是B比C少1。
~(0) = -1
~(-1) = 0
~(-2) = 1
~(-3) = 2
~(-4) = 3
~~3 = 3
~~ 5 = 5
記憶方法是~(A) = -(A+1)
負數原碼補碼轉換規則:
符號位不動,從低位往高位數,遇到第一個1以前,包括第一個1不做任何取反,以後,每位都取反。這樣就避免了原碼轉反碼再轉補碼的繁瑣。