天天看點

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      

繼續閱讀