【问题标题】:rounding to the nearest zero, bitwise按位四舍五入到最接近的零
【发布时间】:2013-04-09 03:26:08
【问题描述】:

我只是想知道如何按位四舍五入到最接近的零?以前,我使用循环执行长除法。但是,由于数字总是除以数字的幂除以 2。我决定使用位移。所以,我可以得到这样的结果:

12/4=3
13/4=3
14/4=3
15/4=3
16/4=4

我可以像往常一样执行长除法吗?

12>>2
13>>2

如果我使用这种位移,不同编译器的行为是否不同?四舍五入怎么样?我正在使用 Visual c++ 2010 编译器和 gcc。谢谢

【问题讨论】:

  • 我认为这取决于几个因素,您是在转换有符号整数还是无符号整数?什么宽度?我发现此链接对了解有关 C 和整数的更多信息很有趣blog.regehr.org/archives/721
  • 啊。它已签名 int(32 位)
  • 根据我的经验,如果您编写 int x; int y; y = x/4;,那么任何值得该死的编译器都应该将 /4 转换为您的位移位(启用优化)。
  • 为什么floating-point会参与其中?

标签: math floating-point bit-manipulation


【解决方案1】:

按位移位相当于以 2 的幂除以负无穷大,这意味着答案永远不会大于未四舍五入的值(例如 (-3) >> 1 等于 -2)。

对于非负整数,这相当于四舍五入。

【讨论】:

  • 四舍五入到负无穷是什么意思?所以,你是说,按位移位产生的行为不会因一个编译器而异到不同的编译器?
  • 如果您对有符号整数使用 2s 补码和算术移位,则所有编译器都应该相同。
  • 舍入到负无穷意味着如果结果是 2.5 或 -2.5,舍入总是使数字更小(到下一个更小的整数),所以 2.x => 2 和 -2.x => -3.
  • 嗨@nneonneo ...您能在某处提供来源或规格表,以便我可以阅读更多相关信息吗?我正在进入 JS 并使用按位运算符,并且我试图准确地围绕 如何 按位运算符将始终截断小数点后的数字。你的答案是我找到的第一个提供解释的答案,我想知道这些知识来自哪里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 2014-12-14
  • 2012-04-22
  • 1970-01-01
相关资源
最近更新 更多