2013-04-08 64 views
0

是存在執行更有效的方式:有效的替代FMOD(X,2)

f = fmod(x+1, 2) 

,以確定值是否爲偶數?

例如

f = 1爲的x

所有奇數值的所有甚至x

f = 0值我只需要這爲正整數的集合工作(我x數據類型是int

+1

您可以使用正常的模運算與整數。我懷疑它在優化之後效率會更高,但'x&1'也可以。 – chris 2013-04-08 15:04:15

+0

wierdly原FMOD似乎更快,則x%2上使用gprof – bph 2013-04-10 12:24:03

回答

5

爲什麼你是否使用fmod()作爲整數?

標準測試將是:

const int f = (x + 1) % 2; /* Will be 1 if x is even, 0 if it's odd. */ 

的是它內置的整數模運算符%做的測試。

加入1是(在我看來)有點混亂,我會做它:

const int f = (x % 2) == 0; 

人誰「認爲,在位」經常寫測試爲:

const int f = (x & 1) == 0; 

由於最低有效位必須清除整數爲偶數。雖然這可以被認爲不太清楚。

+0

我不知道分析 - 我讀別人的代碼,並試圖改善它。你會發現兩個運營商之間的性能差異嗎? – bph 2013-04-08 15:08:19

+1

整數的最低有效位不需要清零,以使整數爲偶數。通常,應該使用算術運算符(如'%')來操作數值和按位運算符(如'&')來操作位。這避免了這樣的錯誤(認爲所有整數的位表示都是二進制補碼)。與'(x + 1)%2'不同,'x%2 == 0'避免溢出。 – 2013-04-08 17:42:28

1

你可以只強制轉換爲int,我想...

f = (int)x % 2; 
4

假設正整數

f = 1 - (x&1); 

應該爲你工作。

+1

此挑戰[優先規則](http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence);按位和綁定不如二進制減去,所以這被解析爲'f =(1 - x)&1'。不知道這是否是一個問題,但我必須說我發現它是一個複雜的解決方案,格式化使它更加可怕。 :) – unwind 2013-04-08 15:24:19

+0

謝謝。我認爲它仍然有效,但肯定不是我想要的。現在更新。 – simonc 2013-04-08 15:32:30