2012-10-06 57 views
1

我有一個應該計算閾值的表達式。原來的代碼是:字節操作c#

float threshold = vertHist.min + ((vertHist.max - vertHist.min)/2); 

但後來修改爲:

retVal.threshold = (byte)(minValue + ((maxValue - minValue) >> 1)); 

我能理解原代碼和它背後的邏輯,但也有人親切地走在我通過後者的代碼,這是前者的修訂版本?

謝謝。

+4

「>> 1」表示右移1,這與2的補碼無符號整數數據類型相除。新代碼應該使用'/ 2'來代替,以便理解。如果我的一個團隊將這些代碼檢查到我的代碼庫,它會提示非常苛刻的代碼審查! –

+0

謝謝。這很好地總結了答案。你爲什麼不提交這個答案? – Nate

+1

需要注意的是它只能用整數('long','int','short','byte')來工作。注意到原始值被賦予了一個「浮點數」,這讓我懷疑方程的有效性。我會說,這是一個非常不必要的優化,它是編譯器肯定會爲你做的一件事。除此之外,等式的其餘部分是相同的。 – pickypg

回答

1

>>是按位右移運算符。對於正整數(你期望得到maxValue - minValue),它具有除以(的冪)2的效果,編譯器實際上有時候會用右移替代一個除法,所以你應該避免替換除非你特別要求換擋行爲,否則會出現換擋。