3 回答

TA貢獻1829條經驗 獲得超7個贊
簡短答案:不太可能。
長答案:您的編譯器中包含一個優(yōu)化器,該優(yōu)化器知道如何以目標處理器體系結構所能達到的速度快速進行乘法。最好的選擇是清楚地告訴編譯器您的意圖(即i * 2而不是i << 1),然后讓它決定最快的匯編/機器碼序列。處理器本身甚至可能已將乘法指令實現為一系列移位和微碼加法運算。
最重要的是-不要花很多時間擔心這個問題。如果您要轉移,那就轉移。如果要乘,就乘。做語義上最清晰的事情-您的同事以后會感謝您?;蛘?,更可能的是,如果以后否則詛咒您。

TA貢獻1906條經驗 獲得超3個贊
只是一個具體的測量點:多年以前,我對哈希算法的兩個版本進行了基準測試:
unsigned
hash( char const* s )
{
unsigned h = 0;
while ( *s != '\0' ) {
h = 127 * h + (unsigned char)*s;
++ s;
}
return h;
}
和
unsigned
hash( char const* s )
{
unsigned h = 0;
while ( *s != '\0' ) {
h = (h << 7) - h + (unsigned char)*s;
++ s;
}
return h;
}
在我對其進行基準測試的每臺機器上,第一臺至少和第二臺一樣快。令人驚訝的是,有時速度更快(例如在Sun Sparc上)。當硬件不支持快速乘法(大多數都不支持快速乘法)時,編譯器會將乘法轉換為移位和加/減的適當組合。而且由于它知道最終目標,因此有時可以用比您明確地編寫班次和加/減的方式少的指令來實現。
請注意,這就像15年前。希望從那時起,編譯器只會變得更好,因此您可以指望編譯器做正確的事情,可能比您做的更好。(此外,代碼看起來如此“ C”的原因是因為它已經超過15年了。std::string今天,我顯然會使用和迭代器。)

TA貢獻1876條經驗 獲得超5個贊
除了這里所有其他好的答案之外,讓我指出在表示除法或乘法時不使用移位的另一個原因。我從未見過有人通過忘記乘法和加法的相對優(yōu)先級來引入錯誤。當維護程序員忘記通過移位進行“乘法”在邏輯上是乘法,但在語法上卻沒有與乘法相同的優(yōu)先級時,我已經看到了引入的錯誤。x * 2 + z
而且x << 1 + z
有很大的不同!
如果您正在處理數字,請使用算術運算符,例如+ - * / %
。如果您正在處理位數組,請使用位旋轉運算符,例如& ^ | >>
。不要混在一起;一個既有點搖擺又有算術的表達式是一個等待發(fā)生的錯誤。
- 3 回答
- 0 關注
- 1285 瀏覽
添加回答
舉報