【问题标题】:Binary reversed to decimal number二进制反转为十进制数
【发布时间】:2019-09-22 14:39:34
【问题描述】:

创建一个名为 reversed_binary_value 的模板函数。它必须采用任意数量的布尔值作为模板参数。这些布尔值以相反的顺序表示二进制数字。您的函数必须返回一个与布尔值表示的数字的二进制值相对应的整数。例如: reversed_binary_value() 应该返回。

这就是问题所在,我就这样解决了。

template<bool...digits>
int reversed_binary_value()
{
    vector<bool> vec = {digits...};
    int result = 0;
    for(int i = 0; i < vec.size(); i++)
        result += pow(2 * vec[i],  i);        
    return result;
}

template <int N>
void sum()
{
    std::cout << "Number is: ";
}

int main()
{
     std::cout << reversed_binary_value<1,0,0,0,1,1>();
    //sum<reversed_binary_value<1,0,0,0,1,1>()>();
}

我正在尝试调用函数 sum,但出现此错误:调用非 constexpr 函数 'int reversed_binary_value()。 我知道不是编译时指令。我的问题是,我怎样才能调用函数 sum ?

【问题讨论】:

  • 为什么sum 必须通过template 值接受它的参数?这在您当前的方法中是不可能的,因为它需要 reversed_binary_value 能够在编译时进行评估,但是创建 std::vector 使得按照当前标准不可能。
  • 您遗漏了问题陈述的结尾。
  • 我知道那样做是不可能的。我想知道我怎样才能实现功能int reversed_binary_value() 成为可能。
  • 但是.. 这就是任务。你应该考虑一下并解决它????不仅仅是让我们为您提供解决方案...
  • 设为 constexpr 并且不要使用任何堆分配,因为目前在 constexpr 上下文中不允许这样做。

标签: c++


【解决方案1】:

您可以使用递归方法:

#include <iostream>

template <typename = void>
constexpr int binary() {
        return 0;
}
template <bool d, bool...digits>
constexpr int binary() {
        return d + 2 * binary<digits...>();
}

template <int N>
void sum() {
        std::cout << N;
}
int main() {
        sum<binary<1,0,1>()>(); // prints 5
}

这允许您为二进制函数添加constexpr(无循环),并允许模板调用所需的常量传播到 sum :)

【讨论】:

    【解决方案2】:

    reversed_binary_value() 的结果不能用作模板参数,因为它不是在编译时确定的(它需要是 constexpr,但不能是当前定义的那个)。除了将sum() 定义为模板函数,您还可以将其设为以整数为参数的常规函数​​:

    void sum(int N)
    {
        std::cout << "Number is: " << N;
    }
    
    int main()
    {
         std::cout << reversed_binary_value<1,0,0,0,1,1>() << std::endl;
         sum(reversed_binary_value<1,0,0,0,1,1>());
    }
    

    另外一件事:您可以按如下方式使用位移,而不是依赖 pow() 函数来计算 2 的幂:

        result += vec[i] * (1u << i);
    

    【讨论】:

      猜你喜欢
      • 2014-10-30
      • 2012-10-26
      • 2012-06-26
      • 2010-12-08
      • 1970-01-01
      • 2014-01-07
      • 2012-04-08
      • 2011-01-08
      • 2012-11-09
      相关资源
      最近更新 更多