的符号a % b
只被定义如果a
和b
都是非负.
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"都会消失.
的符号a % b
只被定义如果a
和b
都是非负.
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; }
以下应独立于mod运算符的实现:
int range = kUpperBound - kLowerBound + 1; kx = ((kx-kLowerBound) % range); if (kx<0) return kUpperBound + 1 + kx; else return kLowerBound + kx;
与其他解决方案相比,优势在于它仅使用单个%(即除法),这使得它非常有效.
注意(关闭主题):
这是一个很好的例子,为什么有时候定义区间是明智的,上限是不在范围内的第一个元素(例如对于STL迭代器......).在这种情况下,"+1"都会消失.