есть 2 задачи: упакованый масив и Оптимизированый словарь.
1-ю реализовал по максимум, но где-то ошибся из-за чего, даже отловить ошибку не могу т.е. при дебаге у меня вообще выводится мусор, хотя считывает правильно.
вот код:
Код:
//author Kornev Ivan
#include <bitset>
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
bitset<16> bufbs;
class packetbit
{
private:
unsigned *_arrayns; //Array
unsigned _sizearray; //Size of Array
unsigned _maxd; //Max Dec
unsigned _word; //Mask Word
char _sword; //Size of Word
unsigned count;
//Размер числа в битах учитывая младшие
friend int hibit(const unsigned &num);
//Упаковка в 16 бит\число
friend unsigned setnum(const unsigned &pack, const char &wordsize, const unsigned &num, const unsigned &wordnum);
//Распаковка из 16 бит\число
friend unsigned getnum(const unsigned &pack, const char &wordsize, const unsigned &wordnum);
public:
packetbit(const unsigned &SizeArray, const unsigned MaxDec)
{
_sizearray = SizeArray;
_sword = hibit(MaxDec);
_word = 16 / _sword;
count = (_sizearray / _word + _sizearray % _word);
_arrayns = new unsigned [count];
for (int I = 0; I < count; I++) _arrayns[I]=0;
};
~packetbit()
{
delete [] _arrayns;
};
//записывает в 16 бит \ число
void setn(const unsigned &num, const unsigned &wordnum)
{
cout << bitset<17>(_arrayns[int(floor(wordnum / _word))]) << endl;
_arrayns[int(floor(wordnum / _word))] = setnum(_arrayns[int(floor(wordnum / _word))], _sword, num, wordnum);
cout << bitset<17>(_arrayns[int(floor(wordnum / _word))]) << endl;
};
//считывает из 16 бит \ число
unsigned getn(const unsigned &wordnum)
{
cout << bitset<17>(_arrayns[int(floor(wordnum / _word))]) << endl;
return getnum(_arrayns[int(floor(wordnum / _word))], _sword, wordnum);
cout << bitset<17>(_arrayns[int(floor(wordnum / _word))]) << endl;
};
};
//Размер числа в битах учитывая младшие
int hibit(const unsigned &num)
{
if (!num)
return 0;
return int(log(num) / log(2) + 1);// долго - не оптимально, но мамтематическим путем и всегда стабильно
};
//Упаковка в 16 бит\число
unsigned setnum(const unsigned &pack, const char &wordsize, const unsigned &num, const unsigned &wordnum)
{
//bufbs = pack;
//cout << bufbs << endl;
unsigned maskword = ((1 << wordsize) - 1) << (wordnum*wordsize); //создаем маску слова
maskword ^= (1 << 16) - 1; //переворачиваем маску
cout << (bitset<17>(num << (wordnum*wordsize))) << endl;
return ((pack & maskword) | (num << (wordnum*wordsize)));
};
//Распаковка из 16 бит\число
unsigned getnum(const unsigned &pack, const char &wordsize, const unsigned &wordnum)
{
//bufbs = pack;
//cout << bufbs << endl;
unsigned maskword = ((1 << wordsize) - 1) << (wordnum*wordsize);//создаем маску числа
cout << (bitset<17>((pack & maskword) >> (wordnum*wordsize))) << endl;
return ((pack & maskword) >> (wordnum*wordsize));//очищаем все по маске, кроме слова, сдвигаем и получаем число
};
int main()
{
unsigned n, maxd;
cout << "Enter count of Dec="; cin >> n; cout << endl;
cout << "Enter Maximum Dec="; cin >> maxd; cout << endl;
cout << "MAX Bit=" << (hibit(maxd)) << "\tof\tMAX Number=" << maxd << endl;
//проверяем случайными числами
packetbit pb(n, maxd);
srand(time(0)); // генерация случайных чисел
for (int I = 0; I < n; I++)
{
unsigned rnd = rand() % maxd;
pb.setn(rnd, I);
cout << rnd << '=' << pb.getn(I) << endl;
//if (rnd != pb.getn(I)) cout << "\a";
};
system("pause>>void");
return 0;
};
Если вводить максимальные значения кратные двум (3,63,250) т.е. которые помещаются в 16 без остатка - нормально, если другие (7, 31) то не работает как следует.
попробуйте на начальных данных 11 и 31 или 17 и 7.
По моему ошибка где-то в записи или проблема с динамическим массивом.
2я задача просто описать что делает или для чего нужна программа в приложении.