在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