【问题标题】:Calculating the arithmetic mean (average) of two numbers: what's the meaning of optimizations?计算两个数字的算术平均值(平均值):优化的含义是什么?
【发布时间】:2014-05-26 13:39:49
【问题描述】:

我注意到在 .NET 中,Array.BinarySearch(Array array, Object value) 方法使用 following implementation 来计算两个数字的平均值:

private static int GetMedian(int low, int hi)
{
    return low + ((hi - low) >> 1);
}

我对这个实现有两个问题:

  1. 为什么要显式使用算术移位运算符?通过用算术移位替换除以 2 来优化除以 2 不是编译器的工作吗?

  2. 为什么不直接return (low + hi) >> 1;

【问题讨论】:

  • 也许同样的代码不仅用于具有完整 JIT 编译器的普通 .NET 框架,而且还用于 .NET Micro,这种优化可以使事情变得更快。
  • 另外,当lowhi相差1时,>> 1/ 2会产生不同的结果。可能一个结果比另一个更好(也许只是在那个程序员的眼中)。

标签: c# .net optimization average mean


【解决方案1】:
  1. 不确定,但也没有坏处。

  2. 是为了防止binary search bug发生。

【讨论】:

  • 不过,这只是问题后半部分的答案。
  • 有趣,根据链接是 C 中避免溢出的正确代码:mid = ((unsigned int)low + (unsigned int)high)) >> 1; 你知道为什么 OPs 代码会省略强制转换吗?
  • @thumbmunkeys:(a)它不是 C,(b)当你可以减去并得到相同的结果时,为什么要进行转换?
  • @Joey 谢谢。我确实意识到这不是 C。你是对的,现在我想起来了,我认为演员表是没有必要的
【解决方案2】:
  1. 没有理由。也许是为了确保编译器做得很好。
  2. 为了避免(low + hi) > int.MaxValue时的算术溢出。

【讨论】:

    【解决方案3】:
    1. 程序员已经倾向于使用最佳代码。
    2. (low + hi) 可能导致整数溢出。

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 1970-01-01
      • 2017-02-06
      • 2013-01-14
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      相关资源
      最近更新 更多