2 升至 N 次幂,无需任何循环或递归或库函数

2 raised to power n without any loop or recursion or library function

本文关键字:循环 任何 递归 库函数 升至 次幂      更新时间:2023-10-16

下面的程序计算2的幂n,而不使用任何循环,运行时递归或库函数[pow]。
它使用模板元编程技术。

#include <iostream>
using namespace std;
template<int n> struct funStruct
{
    enum { val = 2*funStruct<n-1>::val };
};
template<> struct funStruct<0>
{
    enum { val = 1 };
};
int main()
{
    cout << funStruct<8>::val << endl;
    return 0;
}

我在徘徊,我可以用功能代替结构吗?

正如@tdammes指出的那样,显而易见的解决方案只是一种非迭代的非递归方法:

constexpr int pow2( unsigned pwr ) {
   return 1 << per;
}

通过使用constexpr编译器将在编译时计算结果并生成编译时常量。如果您仍想使用递归,您可以:

constexpr int pow2( unsigned pwr ) {
   return pwr==0? 1 : 2*pow2(pwr-1);
}

这基本上与元编程技巧相同的编译时递归,以更简洁和易于阅读的方式。当然,使用 constexpr 需要 C++11,所以如果你没有它,你总是可以使用原始的元编程技巧,或者@tdammers适应的方法:

template <unsigned int N>
struct pow2 {
   static const unsigned int value = 1 << N;
};

这是一个显而易见的解决方案:

unsigned int power_of_two(unsigned int power) {
    return (1 << power);
}

您可以支持有符号幂,但这在整数数学中毫无意义,因为 2 的所有负幂都小于 1,并且会截断为 0。