Объяснения арифметики (код С++)

244
24 апреля 2018, 03:09

Имеется код. Что делает "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);
}
Answer 1

Первое:

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.

READ ALSO
Как устно решить элементарную задачу с логическим выражением на делимость чисел

Как устно решить элементарную задачу с логическим выражением на делимость чисел

Добрый деньЕсть функция D(n, m), проверяющая, кратно ли натуральное число n натуральному числу m (пишу на C++ 11):

225
Ассемблер. Арифметика

Ассемблер. Арифметика

Найти целочисленное решение уравнения a*x+b=0, если оно существуетВопрос: как разделить -b на a

242
GameDev. Подскажите, с чего начать

GameDev. Подскажите, с чего начать

ПриветПомогите пожалуйста, с чего стартануть в сфере разработки игр

218
Qt использование cell и qtablewidget в разных классах

Qt использование cell и qtablewidget в разных классах

Самостоятельно изучаю qt, не кидайтесь тапками, пожалуйстаУ меня есть класс клеток поля, в котором лежит QTableWidgetItem *item;

222