JS按位非(~)運算子與~~運算子的理解分析
阿新 • • 發佈:2019-10-01
在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