我只是不知道如何可以四舍五入到最接近零逐位?以前,我使用循环执行长分区。但是,由于数字总是被数字除以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