2012-09-13 31 views
2

爲什麼〜0xF等於0xFFFFFFF0?爲什麼在32位機器上〜0xF等於0xFFFFFFF0?

此外,如何爲~0xF && 0x01 = 1?也許我也沒有得到0x01。

+2

'&&'是邏輯AND,不是按位AND。 〜是一個標準的按位操作。 – chris

+0

我知道做什麼,但我認爲0xF(即使在32位)將是0x11111111? – sebi

+2

'0xF'是'0x0000000F'。在什麼世界將等於'0x11111111'? –

回答

12

問題1

爲什麼〜0xF等於0xFFFFFFF0?

首先,這意味着你在32位機器上運行它。這意味着0xF實際上是在hexadecimal0x0000000F

這意味着0xF是 0000 0000 0000 0000 0000 0000 0000 1111的二進制形式。

~的操作裝置的非操作。在二進制表示中,每0到1和每1到0更改。這將使〜0xF成爲:二進制表示中的 1111 1111 1111 1111 1111 1111 1111 0000

這實際上是0xFFFFFFF0

請注意,如果你這樣做了16位機上的~0xF答案是0xFFF0

問題2

你寫了錯誤的說法,應該是0xF & 0x1。請注意,0x10x01,0x0010x0001都是相同的。因此,讓我們改變這個hexdecimal號二進制表示:

0xF是:

0000 0000 0000 0000 0000 0000 0000 1111

0x1是:

0000 0000 0000 0000 0000 0000 0000 0001

&操作遵循以下規則:

0 & 0 = 0 
0 & 1 = 0 
1 & 0 = 0 
1 & 1 = 1 

這樣算下來,爲每一位,你得到的結果是:

0000 0000 0000 0000 0000 0000 0000 0001

這實際上是0x1

附加

|裝置按位或運算。它遵循:

0 | 0 = 0 
0 | 1 = 1 
1 | 0 = 1 
1 | 1 = 1 

^指按位異或運算。它遵循:

0^0 = 0 
0^1 = 1 
1^0 = 1 
1^1 = 0 

你可以得到更多的信息here

+0

爲了記錄,給出的AND,OR和XOR規則列表被稱爲真值表,如果它使它們更容易找到。 – chris

+0

@chris謝謝:) – shengy

+0

謝謝,很好解釋! – sebi

0

你否定0xF,其翻轉所有位的他們的倒數。因此,例如,您有8位:0xF = 00001111。如果你否定它,它會變成11110000

由於您使用的是32位,所以F就完全擴展了。 1111 .... 0000

關於第二個問題,您使用的是邏輯與,不按位與。這兩個行爲完全不同。

+1

「您正在否定0xF」 - 錯誤;倒置不是否定。 –

0

這聽起來像你的困惑是,你相信0xF是一樣的0b1111111111111111。它不是,它是0b0000000000001111。

0

〜0xF反轉其所有位,去

from 0x0000000F = 00000000000000000000000000001111 (32 bits) 
to 0xFFFFFFF0 = 11111111111111111111111111110000 (32 bits) 

一個& & b爲1,如果a和b是非零,和〜0xF和0x01都是非零的。

0

在C中,~0xF永遠不能等於0xFFFFFFF0。前者是負數(C允許的三個簽名表示中的任何一個),後者是一個正數。但是,如果二者在二進制補碼實現中轉換爲32位無符號類型,轉換後的值將相等。

至於~0xF && 0x01&&算子是邏輯的,而不是按位和。

相關問題