// DP_Lab1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//

#include <iostream>
void func(int* table, unsigned __int32 x)
{
    unsigned __int8* bits = new  unsigned __int8[4];
    for (int i = 0; i < 4; i++) {
        bits[3 - i] = x % 256;
        x >> 8;
    }
    for (int j = 0; j < 4; j++)
    {
        bits[j] = table[bits[j]];
    }

    for (int i = 0; i < 4; i++) {

        x = x + bits[i];
        x << 8;
    }
}

void iterate(int* table, unsigned __int32 x, unsigned __int32 key)
{
    func(table, x);
    x = (x | key) >> 3;
    func(table, x);
}

int code(unsigned __int32 x, unsigned __int32 y, unsigned __int32 key)
{
    int* table = new int[256];
    for (int i = 0; i < 256; i++)
    {
        table[i] = (i * (i + 1) >> 1) % 256;
    }
    for (int i = 0; i < 12; i++)
    {
        int nexty = x;
        iterate(table, x, key);
        int nextx = y | x;
        x = nextx;
        y = nexty;
    }
    return (x << 32) + y;

}

int main()
{
    std::cout << (code( 12,2,12));
}



// Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
// Отладка программы: F5 или меню "Отладка" > "Запустить отладку"

// Советы по началу работы 
//   1. В окне обозревателя решений можно добавлять файлы и управлять ими.
//   2. В окне Team Explorer можно подключиться к системе управления версиями.
//   3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
//   4. В окне "Список ошибок" можно просматривать ошибки.
//   5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
//   6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
