2015-09-11 29 views
6

我有下面的代碼位運算符:〜在JavaScript

var a = parseInt('010001',2); 
console.log(a.toString(2)); 
// 10001 
var b = ~a; 
console.log(b.toString(2)); 
// -10010 

The MSDN Say

〜對每個位NOT運算符。 NOT a產生a的倒數 值(又名補碼)。因此

應該回到這個。

This Topic kinda confirm that

所以我不明白,我們怎麼能得到-10010呢?唯一可能的解釋是:

010001被否定101110,但他寫這篇-10001 ,然後一個不起眼的原因,他給我兩個補 和-10001成爲-10010。

但是,在我看來,這一切都非常模糊,您是否會對精確發生的事情有所瞭解。

+3

它看起來像的Javascript認爲這是一個32位有符號一世nt下蓋。 0b010001 = 0x00000011或十進制17.當作爲帶符號的32位整數處理時,它的補碼是0xFFFFFFEE或十進制-18,相當於0x11111111,11111111,11111111,11101110。 –

+0

另外,0b10010爲正數18,所以-0b10010爲-18。 –

回答

2

在幕後,當JavaScript並位運算,將其轉換爲32位帶符號整數,並使用它,然後將結果轉換回到它的內部十進制表示。

因此,您的輸入值010001變爲00000000 00000000 00000000 00010001

這之後掉轉:

~00000000 00000000 00000000 00010001 => 11111111 11111111 11111111 11101110 

轉換爲十六進制,反轉值是0xFFFFFFEE,這相當於-18十進制值。

由於這是一個符號整數具有-18的值,該值被轉換爲通過使用Javascript底層十進制表示的-18。

JavaScript時要打印該作爲基礎-2號,它看到負號和18的值,並打印它作爲-10010,由於10010是正18.

+0

感謝您的答案霰彈槍忍者。我認爲它確實解釋了什麼讓我感到困惑......我的二進制技能已經生鏽了! :) –

+1

我加入這個非常酷的鏈接,瞭解2的補數轉換http://www.wikihow.com/Convert-a-Negative-Binary-to-Decimal –

0

根據Mozilla開發者網站here的文檔。按位註釋任何數字x產生 - (x + 1)。例如,〜5產生-6。這就是爲什麼你在數字前面得到負號。

+0

不知道爲什麼downvotes,因爲這解釋了這個問題完美 – musefan

+0

這涵蓋了實際發生的細節,但這是一個很好的經驗法則要記住。如果OP使用按位操作,那麼解釋它們的工作方式可能更爲正確,而不是提供一個爲簡單起見掩蓋它們的答案。 –

+0

這不解釋_why_,見T.J.克勞德的回答爲更好的解釋。 – Nit

3

JavaScript的按位運算符將它們的操作數轉換爲32位有符號整數(通常爲2's complement),執行它們的操作,然後返回結果作爲JavaScript數字類型中最合適的值(雙精度浮點; JavaScript不有一個整數類型)。更多信息請登錄§12.5.11 (Bitwise NOT Operator ~)§7.1.5 (ToInt32)

所以你10001是:

 
00000000 00000000 00000000 00010001 

,當~是:

 
11111111 11111111 11111111 11101110 

...這的確是負的二進制補碼錶示。

您可能想知道:如果位模式如上,那麼爲什麼b.toString(2)會給您-10010?因爲它顯示你簽名的二進制文件,而不是實際的位模式。 -含義否定,10010含義十進制18。上面的位模式是如何用2s補碼錶示的。 (是的,我確實必須去檢查自己對!)

+0

但這不是-18嗎? – musefan

+1

它是,看看兩個補碼是如何工作的 –

+1

@musefan:原來我沒有錯。二進制補碼二進制中的「11111111 11111111 11111111 11101110」爲-18十進制。 –

1

JavaScript使用的二進制表示32位有符號數,所以

a (010001) (17) is 0000 0000 0000 0000 0000 0000 0001 0001 
b = ~a (?) (-18) is 1111 1111 1111 1111 1111 1111 1110 1110 

原因打印-18爲-10010和方法,以獲取實際值很好地解釋這裏Link

+0

感謝額外的精度AcidBurn! –