【问题标题】:2 raised to power n without any loop or recursion or library function [closed]2 在没有任何循环或递归或库函数的情况下提升到 n 次幂 [关闭]
【发布时间】:2012-06-15 11:21:43
【问题描述】:

下面的程序在不使用任何循环、运行时递归或库函数[pow]的情况下计算 2 的 n 次幂。
它使用 TEMPLATE METAPROGRAMMING 技术。

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

我在徘徊,我可以用函数代替结构吗?

【问题讨论】:

  • 这怎么不使用递归呢?它发生在编译时——但这很明显,因为参数是作为模板参数传递的,所以计算也发生在编译时。
  • 这个特殊的元编程示例的重点是 2^n 是在编译时(递归地)计算的,而不是在运行时。

标签: c++ templates


【解决方案1】:

正如@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;
};

【讨论】:

  • 第一个代码示例中每个 => pwr 有一个错误输入错误。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-06-16
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多