跨越的代碼這一行迷迷糊糊的我有一些麻煩,理解它:不知道這行代碼是指用C
a = ((((z * y) + 31) & ~31)/8) * abs(x);
a
,z
,y
,並且x
都是int
類型。
據我所知,~
具有翻轉所有1
的和0
的,在這種情況下的效果,不31
成爲0
? &
如何在這一行中發揮作用?它不是用於邏輯語句而不是像這樣的等式?
跨越的代碼這一行迷迷糊糊的我有一些麻煩,理解它:不知道這行代碼是指用C
a = ((((z * y) + 31) & ~31)/8) * abs(x);
a
,z
,y
,並且x
都是int
類型。
據我所知,~
具有翻轉所有1
的和0
的,在這種情況下的效果,不31
成爲0
? &
如何在這一行中發揮作用?它不是用於邏輯語句而不是像這樣的等式?
的結果執行按位「與」操作。讓我們通過一個簡單示例逐步完成代碼。例如,我們設置x = y = z = 10;
。你單行可以拆分成幾個部分:
temp1 = z * y;
temp2 = temp1 + 31;
temp3 = temp2 & ~31;
temp4 = temp3/8;
a = temp4 * abs(x);
這裏,temp1
- temp4
也是int
類型。使用上面的代碼和示例值,temp1
和temp2
是簡單的計算:
temp1 = 10 * 10 = 100
temp2 = 100 + 31 = 131
爲了得到temp3
,我們需要知道的temp2
二進制表示,在這種情況下是10000011
。因此,我們得到:
10000011
& 11100000
----------
10000000 = 128 in decimal
因此temp3 = 128
。從這裏,temp4
和a
是微不足道的:
temp4 = 128/8 = 16
a = 16 * 10 = 160
以供將來參考,當你感到困惑的代碼行做什麼,先拆起來就像我之前所做的那樣,然後使用一個調試器(如GDB)遍歷代碼。這將有助於使代碼清晰。
部分的困惑源於您錯誤地評估了~31
的事實。 對於8位數字31的簡單情況,實際上是00011111
,因此~31
= 11100000
不是00000000
。要回答您關於&
運算符的問題,它是一個按位AND運算符,就像~
是一個按位運算符NOT操作符一樣;因此,((z * y) + 31) & ~31
對(z * y) + 31
和~31
爲什麼你認爲只有最低位會翻轉,而不是更高的0位呢? – Deduplicator 2014-09-25 15:23:40
'&'是按位「和」。 '&&'是短路邏輯「和」。有關更多信息,請參閱任何體面C參考。 – 2014-09-25 15:24:37
用臨時變量將它排成零件。然後在調試器中逐行執行該代碼。這將使我們很容易看到發生了什麼。 – 2014-09-25 15:25:40