2013-04-09 70 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