2012-10-17 120 views
1

我無法完成2-completement計算。如果b = 5,爲什麼〜b = -6?

我知道C編譯〜b,如果b = 5,所有比特應該反轉爲-6。但爲什麼?

int b = 101,反轉所有位爲010然後對於2完整的符號我只是加1,但它變成011即3這是錯誤的答案。

我該如何計算位反轉運算符〜?

相似的問題:如果a = 17,怎麼樣〜(〜a)= 17?我們將不得不做兩次互補計算。

+2

'〜(〜A)== A'任何'A',因爲'〜'操作者是自逆。我真的不知道該怎麼解釋它的原因,除了觀察到'〜'獨立地在每一位上運行,並且它對於一個位肯定是自反的。 –

+0

@SteveJessop好的。謝謝。 –

+0

「反轉所有位爲010」 - 否,反轉所有位得到111111 ... 010 –

回答

3

~b不是2補充操作。這是一個按位不操作。它只是反轉數字中的每一位,因此~b不等於-b

例子:

b = 5 
binary representation of b: 0000 0000 0000 0101 
binary representation of ~b: 1111 1111 1111 1010 
~b = -6 

b = 17 
binary representation of b:  0000 0000 0001 0001 
binary representation of ~b: 1111 1111 1110 1110 
~b = -18 
binary representation of ~(~b): 0000 0000 0001 0001 
~(~b) = 17 
+0

好的,但是當你說1111111111111010 = - 6時,你正在使用2-complement,因爲你反轉了所有的位並且加了一個2,得到了這個負數,這是我想知道的部分。我希望你能證實我似乎明白它是如何工作的。 –

+1

@NickRosencrantz:根據2-complement的定義,-x ==〜x + 1。因此,11..1010 + 1 == 11..1011 == -5。這是否回答你的問題? – Andrey

+0

是的,但只能慢慢地按照你實際上反轉所有位並添加一個二進制補碼的步驟。你不會做的是我正在做的錯誤:在第一個逆轉中添加一個。它有助於這是一個通用公式-x =〜x + 1 –

7

其實,這裏是如何5內存(16位整數),通常表示爲:

0000 0000 0000 0101 

當你顛倒5,你翻轉所有位獲得:

1111 1111 1111 1010 

也就是說實際上是十進制的-6。我想在你的問題中,你只是簡單地翻轉最後三位,而實際上你必須考慮所有包含整數的位。

+0

和1111 1111 1111 1010爲十進制形式,反轉所有位並添加一個稱爲2補數表示法(? ),所以實際上有兩次反演,其中一次是用來找出哪個數字的二進制數是以1開始的,因此是負數。 –

3

~僅反轉一個號碼的所有位:

~(~a)=17 if a=17 
~0...010001 = 1...101110 (= -18) 
~1...101110 = 0...010001 (= 17) 

,您只需要在情況下,加1要否定一個號碼(以獲得2- s補碼)即得到-17出17分。

6

b = 101 (5)的問題在於你選擇了一個太少的二進制數字。

 binary | decimal 
~101 = 010  | ~5 = 2 
~101 + 1 = 011 | ~5 + 1 = 3 

如果選擇4位,你會得到預期的結果:

  binary | decimal 
~0101 = 1010  | ~5 = -6 
~0101 + 1 = 1011 | ~5 + 1 = -5 

由於只有3位,你可以從-4 2的補碼錶示整數編碼到+3。 使用4位,可以用2的補碼錶示法編碼從-8到+7的整數。

-6被截斷爲2,-5被截斷爲3位。你至少需要4位。

正如其他人已經指出的那樣,~只是將一個值中的所有位反轉,因此,~~17 = 17

1

~b + 1 = -b

所以:

~(~b)等於~(-b - 1)等於-(-b - 1) -1等於b

事實上,~反轉所有位,如果你再這樣做~,它會轉回。

1

我無法使2-完成計算工作。 我知道C編譯〜b,如果b = 5,所有比特都會反轉爲-6。但爲什麼?

因爲您正在使用二進制補碼。你知道補碼是什麼嗎?

可以說我們有一個字節變量(signed char)。這樣的變量可以具有從0至127或從-128到0

二進制值,它的工作原理是這樣的:

0000 0000 // 0 
... 
0111 1111 // 127 
1000 0000 // -128 
1000 0001 // -127 
... 
1111 1111 // -1 

符號數通常與circle說明。

如果你瞭解上述內容,那麼你就明白了爲什麼〜1等於-2等等。

如果使用了補碼,那麼〜1應該是-1,因爲補碼使用了一個有符號的零。對於用補碼描述的字節,值將從0到127到-127到-0回到0.

+0

我想我知道2補碼的符號,並且正在使用它,因此它不起作用。現在~1等於-2,因爲...... 001反向爲... 110,由兩個補碼的符號爲-2,因爲反轉所有位並加1等於-2!(?) –

+0

@NickRosencrantz 110在二進制補碼中爲-2,因爲這就是如何定義二的補碼,就像我上面所描述的那樣。你不「添加」任何東西。你正在假定有符號數的二進制表示遵循某種數學邏輯,它不會那樣工作。有人簡單地定義:「這是如何在二進制級別上表示有符號數字,處理它」。 – Lundin

0

你聲明b爲整數。這意味着b的值將被存儲在32位中,並且補碼(〜)將在32位字上發生,而不是在最後3位發生。 (:negetive 0:1正)

int b=5 // b in binary: 0000 0000 0000 0101 
    ~b // ~b in binary: 1111 1111 1111 1010 = -6 in decimal 

的整數的符號的最顯著位存儲,從而1111 1111 1111 1010 -6十進制。
類似地:

b=17 // 17 in binary 0000 0000 0001 0001 
    ~b // = 1111 1111 1110 1110 = -18 
相關問題