如何在其本机基础中获取模板整数类型的每个数字?

How to get each digit of a template integral type in its native base?

我正在为整型数组实现基数排序。使用标准库提供的 numeric_limits 函数,我能够使用 numeric_limits::radix 了解任何给定整数类型的本机基础表示,以及该类型可以容纳的该基础中的最大数字数量使用 numeric_limits::digits。为了最佳地实现基数排序,我需要为数组的每个元素依次提取每个数字的值。有没有一些标准的,或者至少是通用的方法来做到这一点?以防万一,我使用的是 C++20,不关心与旧版本标准的向后兼容性,只关心与其他 C++20 代码的最大互操作性。

如果您只使用基数为 2 的整数类型,您可以使用 bitset 来提取每个数字:

auto i = 384762132;
std::bitset<std::numeric_limits<decltype(i)>::digits> b(i);
std::cout << b;     // 0010110111011110000000100010100
std::cout << b[4];  // 1(prints 4th 0-indexed lsb)

如果您想遍历用 radix 基数表示的数字 number 的数字,从 least-to-greatest 有效数字开始,那么像下面这样的循环就可以工作。这个循环假设number是一个支持除法和取模的类型,并且这些运算都是纯整数运算(去掉小数):

auto curr_val = number; //Copy the number, since we're going to modify it.
while(curr_val != 0)
{
  auto curr_digit = curr_val % radix;
  curr_val = curr_val / radix; //Integer division.
}

请注意,无论 number 在该类型使用的任何内部表示中的表示如何,这都有效。因此,即使 numeric_limits<int>::radix 为 2,这也适用于迭代 number 以 base-10 表示的方式。