Имеется код. Что делает "typedef", "static const u256t1" и фрагменты "o1 += (o2^t1).fold(t1);". Объясните, пожалуйста, эти три момента. Поскольку "static const u256t1" одинаковы, значит выполняют одну и ту же функцию за исключением параметром в ней.
std::ostream& operator<< (std::ostream &o, const __uint128_t &x)
{
return o << tostring(x);
}
typedef double_uint<__uint128_t, unsigned long long, 256> u256;
void hash_step(const u256 &i1, const u256 &i2, u256 &o1, u256 &o2)
{
/*
* Cube roots of primes.
* (Square roots don't work as well when folded with zero.
* The high part becomes nearly all one bits.)
*
* They are scaled so that the uppermost bit is set.
* Then the lowest bit is also set, so that the constant is odd
*/
/* cbrt(2) */
static const u256 t1(0xa14517cc6b945711, 0x1eed5b8adf128686,
0x144788148b18fde0, 0x30c00661b7d16e9d);
/* cbrt(3) */
static const u256 t2(0xb89ba24891f7b2e6, 0xef3f8b62b71933e0,
0x50c4a6157ab766cc, 0xfa2ba143e9029653);
/* cbrt(5) */
static const u256 t3(0xdae07de7f6269d97, 0xed0ddb59924b141a,
0x0ae36687aa58c29f, 0xe8293af2918f493b);
/* cbrt(7) */
static const u256 t4(0xf4daedd2c0c4edde, 0x50536bb743875dac,
0xfdb214852ccf272e, 0x53a3540f5e5aa011);
/* cbrt(11) */
static const u256 t5(0x8e55b096fcd22d4e, 0x3c1e6d4936833117,
0x0ae1a0b51ea515b2, 0x6ef98efb6ebf35e3);
/* cbrt(13) */
static const u256 t6(0x967c447c6d817406, 0x7bc5196b06dc9887,
0x214ac2f50046dc65, 0x0f9bfa326367aeb7);
/* cbrt(17) */
static const u256 t7(0xa48fe0a92bc653e6, 0xec03c7ed7e59981b,
0x3e3a27d8d8e54797, 0xd607fe20b08d6175);
/* cbrt(19) */
static const u256 t8(0xaac717b5769b6046, 0x27896d0e27f2c11e,
0x281e73be041f0383, 0xa937169045fb3849);
/* cbrt(23) */
static const u256 t9(0xb601eaa628c0c090, 0xac51900eab494a5c,
0x236edd364b4df8c4, 0x5a0cdaed7df05aed);
o1 = i1;
o2 = i2;
o1 += (o2^t1).fold(t1);
o2 += (o1^t2).fold(t2);
o1 += (o2^t3).fold(t3);
o2 += (o1^t4).fold(t4);
o1 += (o2^t5).fold(t5);
o2 += (o1^t6).fold(t6);
o1 += (o2^t7).fold(t7);
o2 += (o1^t8).fold(t8);
o1 += (o2^t9).fold(t9);
}
Первое:
typedef double_uint<__uint128_t, unsigned long long, 256> u256;
Обявляет тип u256 как тип double_uint<__uint128_t, unsigned long long, 256>, теперь допустимы объявления переменных в виде:
u256 x;
вместо
double_uint<__uint128_t, unsigned long long, 256> x;
Второе, static const:
static const u256 t1(0xa14517cc6b945711, 0x1eed5b8adf128686,
0x144788148b18fde0, 0x30c00661b7d16e9d);
Объявляет статическую константу типа u256
с именем t1
, созданную конструктором, принявшим 4 переменных (см. в скобках).
Аналогично остальные константы.
Третье:
o1 += (o2^t1).fold(t1);
Заносит в переменную o1
результат сложения o1
тем, что вернёт вызов (o2^t1).fold(t1)
. Вызов (o2^t1).fold(t1)
означает следующее: вызвать оператор ^
от переменных o1
и t1
(такой оператор должен быть определён, иначе код не скомпилируется), затем у результата вызова вызвать метод fold с аргументом t1
.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый деньЕсть функция D(n, m), проверяющая, кратно ли натуральное число n натуральному числу m (пишу на C++ 11):
Найти целочисленное решение уравнения a*x+b=0, если оно существуетВопрос: как разделить -b на a
ПриветПомогите пожалуйста, с чего стартануть в сфере разработки игр
Самостоятельно изучаю qt, не кидайтесь тапками, пожалуйстаУ меня есть класс клеток поля, в котором лежит QTableWidgetItem *item;