JS按位非(~)運算符與~~運算符的理解分析


在SF上看到這個問題,js中怎么理解按位取反?

問題:

~ 運算符查看表達式的二進制表示形式的值,並執行位非運算。

Javascript 按位取反運算符 (~) ,對一個表達式執行位非(求非)運算。如 ~1 = -2; ~2 = -3;

js取反我只知道個!,但是~為什么也叫取反,他返回的又不是boolean類型?

~1,~2 的二進制又不是 -2 ,-3 ,怎么會轉換成這么奇怪的值?

網友解答:

按位取反還真和boolean沒多大關系,大體流程是這樣的:

就來看看~1的計算步驟:

  • 1(這里叫:原碼)轉二進制 = 00000001
  • 按位取反 = 11111110
  • 發現符號位(即最高位)為1(表示負數),將除符號位之外的其他數字取反 = 10000001
  • 末位加1取其補碼 = 10000010
  • 轉換回十進制 = -2

有網友對上面的答案進行了三點補充,如下:

  • 按位取反的運算規則這么奇怪並不是JavaScript獨有的,而是所有的計算機語言都是這樣的。這樣做的主要原因是為了為了統一減法和加法,在計算機中,減法會變成加一個負數,而負數會以補碼的形式存儲。而這樣主要是因為補碼和數字的十進制數有這么轉換關系,負數:補碼(x) = -x - 1,正數:補碼(x) = x
  • 因為補碼是針對負數存在的,那么只要數據類型有無符號數,就沒有這樣的煩惱了,比如C語言有無符號整型,就能對無符號整型直接按位取反。
  • 如果沒有無符號類型,而且也只是想要按位取反,而不是附帶補碼的按位取反,需要另外的方法。讓全1的數據和當前數據做按位抑或就行了。比如,你有一個32位的數據a,需要對它做按位取反,那么這樣就行了:0xFFFF ^ a
var a = 0x8321;
console.log(a.toString(2));
console.log((0xFFFF ^ a).toString(2));

//1000001100100001
//111110011011110   => 左邊最高位是0,被隱藏了。

下面舉個例子:

var n = -4.9; console.log(n); //4.9
n = ~n; console.log(n);//3
n = ~n; console.log(n);//4

例2:

var n = 4.2; console.log(n); //4.2
n = ~n; console.log(n);//-5
n = ~n; console.log(n);//4

例3:

var n = 4; console.log(n); //4
n = ~n; console.log(n);//-5
n = ~n; console.log(n);//4

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM