Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2014, 17:39   #1
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
Подмигивание работа с битами

есть 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я задача просто описать что делает или для чего нужна программа в приложении.
Вложения
Тип файла: rar qmap_test.rar (2.1 Кб, 8 просмотров)

Последний раз редактировалось IvaniuS; 06.06.2014 в 17:43.
IvaniuS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с битами codermoder Общие вопросы C/C++ 2 18.11.2011 06:25
работа с битами Henpyxa Общие вопросы C/C++ 5 23.05.2010 12:09
Работа с битами viktory Помощь студентам 8 02.10.2009 18:33
Работа с битами в C dmitmal Общие вопросы C/C++ 5 20.05.2009 04:27
Работа с битами kesha2008 Общие вопросы C/C++ 2 24.02.2009 12:05