我试图了解以下代码在做什么。特别是功能reverse_binary_value()
。
我已经阅读了可变参数函数,但是我不明白为什么在返回值的同时向左移1。
我在hackerank上获得了这些代码。问题是这样的
创建一个名为reversed_binary_value的模板函数。它必须使用任意数量的布尔值作为模板参数。这些布尔值以相反的顺序表示二进制数字。您的函数必须返回一个与布尔值表示的数字的二进制值相对应的整数。例如:reversed_binary_value <0,0,1>()应该返回4。
第一行包含一个整数,即测试用例的数量。随后的每一行都包含一个测试用例。测试用例分别描述为以空格分隔的整数。
x是要比较的值。
y表示要比较的范围:64 * y至64 * y + 63
输出的每一行包含64个二进制字符。(即0和1)。每个字符代表该范围内的一个值。第一个字符对应于范围内的第一个值。最后一个字符对应于范围内的最后一个值。如果范围中的值与X匹配,则字符为1;否则为0。否则,该字符为0。
2 65 1 10 0
0100000000000000000000000000000000000000000000000000000000000000000000000000 0000000000100000000000000000000000000000000000000000000000000000000000000000000000
#include <iostream>
using namespace std;
template <bool a> int reversed_binary_value() { return a; }
template <bool a, bool b, bool... d> int reversed_binary_value() {
return (reversed_binary_value<b, d...>() << 1) + a;
}
template <int n, bool...digits>
struct CheckValues {
static void check(int x, int y)
{
CheckValues<n-1, 0, digits...>::check(x, y);
CheckValues<n-1, 1, digits...>::check(x, y);
}
};
template <bool...digits>
struct CheckValues<0, digits...> {
static void check(int x, int y)
{
int z = reversed_binary_value<digits...>();
std::cout << (z+64*y==x);
}
};
int main()
{
int t;
std::cin >> t;
for (int i=0; i!=t; ++i) {
int x, y;
cin >> x >> y;
CheckValues<6>::check(x, y);
cout << "\n";
}
}
我已经阅读了可变参数函数,但是我不明白为什么在返回值的同时向左移1。
template <bool a, bool b, bool... d> int reversed_binary_value() {
return (reversed_binary_value<b, d...>() << 1) + a;
}
想象您有那个例子<0,0,1>
。对应于100
,十进制为4。此函数是递归模板,在第一次迭代中,a表示最低有效位,在第二次迭代中,其表示下一个有效位。为了正确形成值,reversed_binary_value<b, d...>()
必须在每次迭代期间将的结果左移一位。
通过迭代:
reversed_binary_value<0,1>()
reversed_binary_value<1>()
reversed_binary_value<1>()
对应于非可变变量,template <bool a> int reversed_binary_value() { return a; }
因为它与模板参数列表匹配。
从递归返回:
1 << 1 + 0
等于binary 10
,即十进制为2。10 << 1 + 0
等于binary 100
,即十进制为4。看看它在测试运行中如何工作可能很奇怪:
template <bool a> int reversed_binary_value() {
cerr << "a = " << a << ";\n";
return a;
}
template <bool a, bool b, bool... d> int reversed_binary_value() {
cerr << "a = " << a << " b = " << b << " d = ";
(cerr << ... << d); // C++14
cerr <<";\n";
return (reversed_binary_value<b, d...>() << 1) + a;
}
请注意,在stderr上的输出(流#2)上,cerr
和cout
可能不同步,因此输出tocout
可能会混乱。
a = 0 b = 0 d = 0000;
a = 0 b = 0 d = 000;
a = 0 b = 0 d = 00;
a = 0 b = 0 d = 0;
a = 0 b = 0 d = ;
a = 0;
a = 1 b = 0 d = 0000;
a = 0 b = 0 d = 000;
a = 0 b = 0 d = 00;
a = 0 b = 0 d = 0;
a = 0 b = 0 d = ;
a = 0;
a = 0 b = 1 d = 0000;
a = 1 b = 0 d = 000;
a = 0 b = 0 d = 00;
a = 0 b = 0 d = 0;
a = 0 b = 0 d = ;
a = 0;
...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句