在整数类型的整个范围内进行迭代

Iterating over the full range of an integer type

本文关键字:范围内 迭代 整数 类型      更新时间:2023-10-16

我的第一个问题是,迭代特定类型的所有可能值的最佳方式是什么?似乎没有真正干净的方法来实现这一点。

对于无符号整数类型,

unsigned x = 0;
do {
    // something with x
} while (++x > 0);

你可以这样做,因为无符号积分类型服从算术模2^n的定律。

对于一个有符号的积分类型,类似这样的东西会起作用,尽管它不那么干净:

int x = std::numeric_limits<int>::min();
while (true) {
    // do something with x
    if (x == std::numeric_limits<int>::max()) break;
    x++;
}

对于整数类型T,可以使用

const T i0 = std::numeric_limits<T>::min();
const T in = std::numeric_limits<T>::max();
for(T i=i0;i!=in;++i) do_something(i);
do_something(in);

浮点类型有点棘手。IEEE754定义了一个操作,允许您在任何给定值之上(或之下(步进到下一个可表示的数字,但据我所知,没有一个标准的C++函数来公开它。

对小类型的迭代可以通过首先转换为具有较大大小的较大类型来完成。容易的(注意,long long几乎总是大于int,但不能保证是。(

for(long long i = INT_MIN; i<=INT_MAX; ++i) 
    ^^^^^^^^^

或者,将最后一个分离出来:

for(int i=INT_MIN; i<INT_MAX; ++i)
    do_thing(i);
do_thing(INT_MAX); //get the last one 

如果你想迭代一个大型类型(long-long或unsigned long-long(,我不得不想知道你在做什么,因为简单地迭代需要大约四百年的时间,更不用说用它们做任何事情了(假设3.0GHz单核处理器(。用世界上最快的超级计算机"天河二号"在64位范围内迭代大约需要12天。