2014-06-19 91 views
2

我遇到了代碼original link of code,其中的一部分對我來說不清楚。現在有條件地設置或清除位

bool f;   // conditional flag 
unsigned int m; // the bit mask 
unsigned int w; // the word to modify: if (f) w |= m; else w &= ~m; 
w ^= (-f^w) & m; 
// OR, for superscalar CPUs: 
w = (w & ~m) | (-f & m); 

,符合w ^= (-f^w) & m;和線w = (w & ~m) | (-f & m);他們使用-f。當我嘗試沒有-f,只是使用f它給了我相同的答案。即使在初始化f=true/false的值後我試圖打印-f,它仍然保持不變並且不會改變。請問有人能告訴我-f這裏的重要性。

+0

當執行這個語句時'w'被初始化:'w^=(-f^w)& m;' –

+0

對於那些想知道https://graphics.stanford.edu/~seander/bithacks.html#ConditionalSetOrClearBitsWithoutBranching的人來說,您應該始終添加源文件併爲原作者提供信用。 – user2485710

+0

當然,這就是爲什麼我寫我碰到一個代碼。不過,你是對的,謝謝。 – user3508953

回答

2

您引用的代碼似乎假定(unsigned int)(-true)將評估爲UINT_MAX。 C標準沒有這樣的保證,(-true)的值可以是其二進制表示全部爲1的任何值,包括值1

雖然是可以修復的,但通過鑄造。 -(unsigned int)f應該給你正確的答案。

當一個無符號的值設置爲-1,最大值+ 1被添加,因此成爲該類型的最大值,即,一個設置爲1 -0所有比特等於0明顯。因此,在上面的第一個表達式中,f的值應控制是否(-f^w)的計算結果爲~ww

+0

考慮到這是一個無符號整數,爲什麼你不能否定'0'?像'〜(unsigned int(0))' – user2485710

+0

@ user2485710所需的映射是'0 => 0'和'1 =>〜0'。 –

1

我能找到http://tigcc.ticalc.org/doc/opers.html#unarypm這樣的描述:

一元加號和減號操作符( '+' 和 ' - ')

在這些一元+ - 表達

+ expr 
- expr

expr操作數必須是算術類型。結果是一元加號('+')運算符的任何必需整數升級後的操作數值,或一元減號(' - ')運算符的任何必需整數升級後的操作數值的負值。使用fneg函數在內部執行浮點否定。

請注意,「+」和「 - 」運算符也具有二進制形式。