2014-09-25 40 views
-4

跨越的代碼這一行迷迷糊糊的我有一些麻煩,理解它:不知道這行代碼是指用C

a = ((((z * y) + 31) & ~31)/8) * abs(x); 

azy,並且x都是int類型。

據我所知,~具有翻轉所有1的和0的,在這種情況下的效果,不31成爲0&如何在這一行中發揮作用?它不是用於邏輯語句而不是像這樣的等式?

+2

爲什麼你認爲只有最低位會翻轉,而不是更高的0位呢? – Deduplicator 2014-09-25 15:23:40

+2

'&'是按位「和」。 '&&'是短路邏輯「和」。有關更多信息,請參閱任何體面C參考。 – 2014-09-25 15:24:37

+3

用臨時變量將它排成零件。然後在調試器中逐行執行該代碼。這將使我們很容易看到發生了什麼。 – 2014-09-25 15:25:40

回答

3

的結果執行按位「與」操作。讓我們通過一個簡單示例逐步完成代碼。例如,我們設置x = y = z = 10;。你單行可以拆分成幾個部分:

temp1 = z * y; 
temp2 = temp1 + 31; 
temp3 = temp2 & ~31; 
temp4 = temp3/8; 
a = temp4 * abs(x); 

這裏,temp1 - temp4也是int類型。使用上面的代碼和示例值,temp1temp2是簡單的計算:

temp1 = 10 * 10 = 100 
temp2 = 100 + 31 = 131 

爲了得到temp3,我們需要知道的temp2二進制表示,在這種情況下是10000011。因此,我們得到:

10000011 
& 11100000 
---------- 
    10000000 = 128 in decimal 

因此temp3 = 128。從這裏,temp4a是微不足道的:

temp4 = 128/8 = 16 
a = 16 * 10 = 160 

以供將來參考,當你感到困惑的代碼行做什麼,先拆起來就像我之前所做的那樣,然後使用一個調試器(如GDB)遍歷代碼。這將有助於使代碼清晰。

1

部分的困惑源於您錯誤地評估了~31的事實。 對於8位數字31的簡單情況,實際上是00011111,因此~31 = 11100000不是00000000。要回答您關於&運算符的問題,它是一個按位AND運算符,就像~是一個按位運算符NOT操作符一樣;因此,((z * y) + 31) & ~31(z * y) + 31~31

相關問題