繁体   English   中英

二进制反转为十进制数

[英]Binary reversed to decimal number

创建一个名为 reversed_binary_value 的模板 function。 它必须采用任意数量的布尔值作为模板参数。 这些布尔值以相反的顺序表示二进制数字。 您的 function 必须返回一个 integer 对应于布尔值表示的数字的二进制值。 例如: 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>()>();
}

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

您可以使用递归方法:

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

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

reversed_binary_value()的结果不能用作模板参数,因为它不是在编译时确定的(它需要是一个constexpr ,但不能是当前定义的那个)。 与其将sum()定义为模板 function,不如将其设为常规 function,将 integer 作为参数:

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() function 来计算 2 的幂,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM