2013-04-09 71 views
1

我只是不知道如何可以四捨五入到最接近零逐位?以前,我使用循環執行長分區。但是,由於數字總是被數字除以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

+0

我認爲這取決於,你換擋簽署幾個因素或無符號整型?什麼寬度?我發現這個鏈接有趣的學習更多關於C和整數http://blog.regehr.org/archives/721 – 2013-04-09 03:35:49

+0

啊。它是有符號int(32位) – 2013-04-09 03:37:50

+0

以我的經驗,如果你寫'int x; int y; y = x/4;那麼任何值得該死的編譯器都應該把這個'/ 4'轉換成一個bitshift(開啓優化)。 – 2013-04-09 03:51:30

回答

3

按位移等效於由2的冪的舍入到負無窮的除法,這意味着答案永遠不會大於未接地的值(例如(-3)>> 1等於-2) 。

對於非負整數,這相當於舍入到零。

+0

你是指什麼輪到負無窮?所以,你說的是,從一個編譯器到另一個編譯器,由逐位移位產生的行爲不會有所不同。 – 2013-04-09 03:39:19

+0

你使用二進制補碼和算術有符號整數轉移提供,這應該是所有的編譯器相同。 – nneonneo 2013-04-09 03:48:59

+0

回合負無窮大意味着如果結果是說2.5或-2.5,舍入總是讓數少(到下一個較小的整數),所以2.X => 2和-2.x => -3。 – 2013-04-09 03:49:25