当前位置:  开发笔记 > 编程语言 > 正文

用C++包装整数的干净,高效的算法

如何解决《用C++包装整数的干净,高效的算法》经验,为你挑选了2个好方法。

的符号a % b只被定义如果ab都是非负.

int Wrap(int kX, int const kLowerBound, int const kUpperBound)
{
    int range_size = kUpperBound - kLowerBound + 1;

    if (kX < kLowerBound)
        kX += range_size * ((kLowerBound - kX) / range_size + 1);

    return kLowerBound + (kX - kLowerBound) % range_size;
}


MartinStettn.. 19

以下应独立于mod运算符的实现:

int range = kUpperBound - kLowerBound + 1;
kx = ((kx-kLowerBound) % range);
if (kx<0)
  return kUpperBound + 1 + kx;
else
  return kLowerBound + kx;

与其他解决方案相比,优势在于它仅使用单个%(即除法),这使得它非常有效.

注意(关闭主题):

这是一个很好的例子,为什么有时候定义区间是明智的,上限是不在范围内的第一个元素(例如对于STL迭代器......).在这种情况下,"+1"都会消失.



1> CB Bailey..:

的符号a % b只被定义如果ab都是非负.

int Wrap(int kX, int const kLowerBound, int const kUpperBound)
{
    int range_size = kUpperBound - kLowerBound + 1;

    if (kX < kLowerBound)
        kX += range_size * ((kLowerBound - kX) / range_size + 1);

    return kLowerBound + (kX - kLowerBound) % range_size;
}



2> MartinStettn..:

以下应独立于mod运算符的实现:

int range = kUpperBound - kLowerBound + 1;
kx = ((kx-kLowerBound) % range);
if (kx<0)
  return kUpperBound + 1 + kx;
else
  return kLowerBound + kx;

与其他解决方案相比,优势在于它仅使用单个%(即除法),这使得它非常有效.

注意(关闭主题):

这是一个很好的例子,为什么有时候定义区间是明智的,上限是不在范围内的第一个元素(例如对于STL迭代器......).在这种情况下,"+1"都会消失.

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有