第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在C中使用移位運算符的乘法和除法實際上更快嗎?

在C中使用移位運算符的乘法和除法實際上更快嗎?

C++ C
拉莫斯之舞 2019-10-15 10:22:57
例如,可以使用位運算符來實現乘法和除法i*2 = i<<1i*3 = (i<<1) + i;i*10 = (i<<3) + (i<<1)等等。使用說(i<<3)+(i<<1)乘以10 真的比i*10直接使用要快嗎?是否存在無法以這種方式相乘或除法的輸入?
查看完整描述

3 回答

?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊

簡短答案:不太可能。

長答案:您的編譯器中包含一個優(yōu)化器,該優(yōu)化器知道如何以目標處理器體系結構所能達到的速度快速進行乘法。最好的選擇是清楚地告訴編譯器您的意圖(即i * 2而不是i << 1),然后讓它決定最快的匯編/機器碼序列。處理器本身甚至可能已將乘法指令實現為一系列移位和微碼加法運算。

最重要的是-不要花很多時間擔心這個問題。如果您要轉移,那就轉移。如果要乘,就乘。做語義上最清晰的事情-您的同事以后會感謝您?;蛘?,更可能的是,如果以后否則詛咒您。


查看完整回答
反對 回復 2019-10-15
?
一只名叫tom的貓

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今天,我顯然會使用和迭代器。)


查看完整回答
反對 回復 2019-10-15
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

除了這里所有其他好的答案之外,讓我指出在表示除法或乘法時不使用移位的另一個原因。我從未見過有人通過忘記乘法和加法的相對優(yōu)先級來引入錯誤。當維護程序員忘記通過移位進行“乘法”在邏輯上是乘法,但在語法卻沒有與乘法相同的優(yōu)先級時,我已經看到了引入的錯誤。x * 2 + z而且x << 1 + z有很大的不同!

如果您正在處理數字,請使用算術運算符,例如+ - * / %。如果您正在處理位數組,請使用位旋轉運算符,例如& ^ | >>。不要混在一起;一個既有點搖擺又有算術的表達式是一個等待發(fā)生的錯誤。


查看完整回答
反對 回復 2019-10-15
  • 3 回答
  • 0 關注
  • 1285 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號