1. 程式人生 > >JS按位非(~)運算子與~~運算子的理解分析

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

 


更多專業前端知識,請上 【猿204