gpt4 book ai didi

c++ - 计算以文本形式书写的数字长度的最简单/优雅的方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 19:40:05 25 4
gpt4 key购买 nike

给定最大可能值,如何简单地表达将这样的数字以小数形式写入文本所需的空间?

真正的任务:在 Linux 上使用 gcc 记录固定长度的进程 ID (pid_t)。最好在 std::setw() iomanipulator 中使用编译时表达式。

我发现 linux/threads.h header 包含一个 PID_MAX 值,其中分配给进程的最大 pid。所以有

#define LENGTH(t) sizeof(#t)-1

LENGTH(PID_MAX) 将是一个编译时表达式,但不幸的是这个数字是以十六进制定义的:

#define PID_MAX 0x8000

我目前最好的解决方案有点奇怪

static_cast<int>( ::floor( ::log(PID_MAX)/::log(10) + 1 ) );

但这是计算运行时并使用来自 math.h

的函数

最佳答案

你可以用一点模板元编程来做到这一点:

//NunLength_interal does the actual calculation. 
template <unsigned num>
struct NumLength_internal
{ enum { value = 1 + NumLength_internal<num/10>::value }; };

template <>
struct NumLength_internal<0>
{ enum { value = 0 }; };

//NumLength is a wrapper to handle zero. For zero we want to return
//a length of one as a special case.
template <unsigned num>
struct NumLength
{ enum { value = NumLength_internal<num>::value };};

template <>
struct NumLength<0>
{ enum { value = 1 }; };

这现在应该适用于任何东西。例如:

cout << NumLength<0>::value      << endl; // writes: 1
cout << NumLength<5>::value << endl; // writes: 1
cout << NumLength<10>::value << endl; // writes: 2
cout << NumLength<123>::value << endl; // writes: 3
cout << NumLength<0x8000>::value << endl; // writes: 5

这都是在编译时处理的。

编辑:我添加了另一层来处理传入的数字为零的情况。

关于c++ - 计算以文本形式书写的数字长度的最简单/优雅的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1260244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com