天天看點

《編寫高品質代碼:改善c程式代碼的125個建議》——建議14-4:盡量避免在同一個資料上執行位操作與算術運算

本節書摘來自華章計算機《編寫高品質代碼:改善c程式代碼的125個建議》一書中的第2章,建議14-4,作者:馬 偉 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

雖然位操作在很大程度上可以提高程式的執行效率,但在同一個變量上執行位操作和算術運算會模糊程式員的意圖,削弱代碼的可移植性與可讀性,還會導緻安全稽核員或代碼維護人員難以确定應該執行什麼檢查以消除安全缺陷,保證資料的完整性。示例代碼如下:

雖然上面的代碼是一條合法的優化語句,但是它的确嚴重地破壞了程式的可讀性。是以,建議采用下面的方式來書寫代碼:

或許這時候有讀者會問,這樣寫代碼不就降低了程式的執行效率嗎?

其實不然,有些優化編譯器會比我們做得更好。以整數乘法為例,如果目标系統有乘法指令,硬體的乘法比自己用移位操作實作的乘法要快得多;如果目标系統沒有乘法指令,編譯器會自動用移位等操作來優化乘法,示例代碼如下:

上面的代碼在microsoft visual studio 2010內建開發環境vc++的debug模式下将生成如下彙編代碼:

從上面的彙編代碼可以看出,編譯器會自動在彙編代碼中用移位操作來優化乘除法運算。是以,完全沒有必要用手工進行這種優化,編譯器會自動完成。我們應該把精力放在改程序式的算法上,一個好的算法可以使程式運作效率大大提高。當然,如果除數為2的幂,那麼在進行除法運算時可以适當地采用移位算法來實作乘除法。

除此之外,采用移位操作還需要注意不要超過該資料類型的精度範圍(資料範圍),示例代碼如下:

在上面的代碼中就要注意精度問題,在32位系統中,int類型占4個位元組,精度範圍為“-2147483647~2147483647”。其中,資料“-2147483647”的原碼為“11111111111111111111111111111111”,補碼為“10000000000000000000000000000001”。現在将“10000000000000000000000000000001”左移1位,最高位的1沒有了,最低位左移一位,得到的結果為2。

繼續閱讀