清洁,高效的算法在C包装整数++ [英] Clean, efficient algorithm for wrapping integers in C++

查看:152
本文介绍了清洁,高效的算法在C包装整数++的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  / **
  *返回一个数字kLowerBound和kUpperBound之间
  *例如为:环绕(-1,0,4); //返回4
  *例如为:环绕(5,0,4); //返回0
  * /
INT包裹(INT常量的kX,INT常量kLowerBound,INT常量kUpperBound)
{
    //推荐的实现?
}
 

解决方案

A%B的标志只被定义,如果 A B 都是非负的。

  INT包裹(INT的kX,INT常量kLowerBound,INT常量kUpperBound)
{
    INT range_size = kUpperBound  -  kLowerBound + 1;

    如果(KX< kLowerBound)
        的kX + = range_size *((kLowerBound  -  KX)/ range_size + 1);

    返回kLowerBound +(KX  -  kLowerBound)%range_size;
}
 

/**
  * Returns a number between kLowerBound and kUpperBound
  * e.g.: Wrap(-1, 0, 4); // Returns 4
  * e.g.: Wrap(5, 0, 4); // Returns 0      
  */
int Wrap(int const kX, int const kLowerBound, int const kUpperBound)
{
    // Suggest an implementation?
}

解决方案

The sign of a % b is only defined if a and b are both non-negative.

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;
}

这篇关于清洁,高效的算法在C包装整数++的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆