我只是不知道如何可以四捨五入到最接近零逐位?以前,我使用循環執行長分區。但是,由於數字總是被數字除以2.我決定使用位移。所以,我可以得到結果如下:四捨五入到最接近零,按位
12/4=3
13/4=3
14/4=3
15/4=3
16/4=4
我能做到這一點通過執行長除法像往常一樣?
12>>2
13>>2
如果我使用這種位移,是不同的編譯器的行爲不同?四捨五入怎麼樣?我正在使用visual C++ 2010編譯器和gcc。 thx
我只是不知道如何可以四捨五入到最接近零逐位?以前,我使用循環執行長分區。但是,由於數字總是被數字除以2.我決定使用位移。所以,我可以得到結果如下:四捨五入到最接近零,按位
12/4=3
13/4=3
14/4=3
15/4=3
16/4=4
我能做到這一點通過執行長除法像往常一樣?
12>>2
13>>2
如果我使用這種位移,是不同的編譯器的行爲不同?四捨五入怎麼樣?我正在使用visual C++ 2010編譯器和gcc。 thx
按位移等效於由2的冪的舍入到負無窮的除法,這意味着答案永遠不會大於未接地的值(例如(-3)>> 1等於-2) 。
對於非負整數,這相當於舍入到零。
你是指什麼輪到負無窮?所以,你說的是,從一個編譯器到另一個編譯器,由逐位移位產生的行爲不會有所不同。 – 2013-04-09 03:39:19
你使用二進制補碼和算術有符號整數轉移提供,這應該是所有的編譯器相同。 – nneonneo 2013-04-09 03:48:59
回合負無窮大意味着如果結果是說2.5或-2.5,舍入總是讓數少(到下一個較小的整數),所以2.X => 2和-2.x => -3。 – 2013-04-09 03:49:25
我認爲這取決於,你換擋簽署幾個因素或無符號整型?什麼寬度?我發現這個鏈接有趣的學習更多關於C和整數http://blog.regehr.org/archives/721 – 2013-04-09 03:35:49
啊。它是有符號int(32位) – 2013-04-09 03:37:50
以我的經驗,如果你寫'int x; int y; y = x/4;那麼任何值得該死的編譯器都應該把這個'/ 4'轉換成一個bitshift(開啓優化)。 – 2013-04-09 03:51:30