2016-09-27 95 views
-1

我正在學習有關C. 這裏屏蔽技術是一個實踐問題,我的工作: 需要找到0×87654321的補充,同時留下至少顯著字節完整應該是這樣的0x789ABC21如何使用按位C操作找到0x87654321的補碼?

唯一的面具我現在熟悉的是使用0x& 0xFF來除去最後一個字節。我不知道使用哪個按位運算符來獲得十六進制數的補碼。我如何解決這個問題?

我的書沒有解釋一個十六進制數的補碼是什麼,但我GOOGLE了,發現確定一個補碼的捷徑方法是採取15 - hexDigit =補充請糾正我,如果我錯了。

+3

'0x87654321U^0xFFFFFF00U' – Kaz

+0

爲什麼會產生補碼? – ixbo45

+0

因爲XOR是布爾「不等於」函數。當我們對一個布爾值1 /真(X XOR True)XOR某個值X時,我們說「X不等於真」,這與「X不是真」是相同的,而不是X是補充。 C ^運算符在操作數的所有相應位上並行應用布爾XOR函數。所以我們可以使用0xFFFFFF00這樣的* mask *來選擇我們想要補充的位。與0異或不做任何事; X XOR 0是X.異或與1翻轉1到0和0到1 .. – Kaz

回答

1

C中的逐位補碼運算符是波形碼~。這會以位模式翻轉每一位。

按位異或運算符(^)也可用於執行按位補碼。按位XOR真值表低於:特別是

^| 0 1 
------ 
0| 0 1 
1| 1 0 

注意1^0 = 1和一個1^1 = 0。因此,按位XOR與一個也將有翻轉的位的影響。

因此,與0xFFFFFF00按位異或將翻轉數字的最後八位。