二进制反转为十进制数

时间:2019-09-22 14:39:34

标签: c++

  

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

这是问题所在,我以这种方式解决了。

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?

2 个答案:

答案 0 :(得分:2)

您可以使用递归方法:

#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(无循环),并允许模板调用求和的常数传播之和:)

答案 1 :(得分:0)

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);