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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2009, 20:26   #1
zgest
Пользователь
 
Регистрация: 23.03.2009
Сообщений: 15
По умолчанию Как создать тип данных?

Как создать целочисленный тип данных, который принимает значение только 0 или 1 и каждая переменная данного типа весит один бит. Или может уже есть такой тип данных?..
zgest вне форума Ответить с цитированием
Старый 24.03.2009, 20:33   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Никак. Бит не является адресуемой единицей данных. Используйте тип bool (в последних версиях С++ имеется, раньше использовался тип int) и не занимайтесь глупостями
pu4koff вне форума Ответить с цитированием
Старый 24.03.2009, 22:41   #3
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Можно создать битовое поле
Код:
struct bits
{
unsigned x:1; /*Выделить 1 бит */
};
Правда толку от такого поля будет не много, ибо память под него выделится все равно больше чем надо. Но вот если определить в нем несколько переменных, то определенный смысл в этом появится
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 25.03.2009, 07:24   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
Можно создать битовое поле
Код:
struct bits
{
unsigned x:1; /*Выделить 1 бит */
};
Правда толку от такого поля будет не много, ибо память под него выделится все равно больше чем надо. Но вот если определить в нем несколько переменных, то определенный смысл в этом появится
Ну да. Компилятор все равно до 4 байт выровняет размер. Если нужно несколько переменных битовых, то можно просто создать переменную int и побитовыми операциями устанавливать/сбрасывать нужные биты.
pu4koff вне форума Ответить с цитированием
Старый 25.03.2009, 08:08   #5
("")(Э_Є)("")
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 112
По умолчанию

STL bitset или
vector<bool> - тоже может занимать один бит, а может и не занимать
STL bitset - размер фиксирован и задается константой.

Последний раз редактировалось ("")(Э_Є)(""); 25.03.2009 в 09:02.
("")(Э_Є)("") вне форума Ответить с цитированием
Старый 25.03.2009, 13:38   #6
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Если нужно несколько переменных битовых, то можно просто создать переменную int и побитовыми операциями устанавливать/сбрасывать нужные биты.
А еще можно ходить на голове
Использовать битовое поле то проще

("")(Э_Є)(""), ровно 1 бит занимать переменная никак не может, ибо, как сказано выше, бит не является адресуемой единицей
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 25.03.2009, 13:43   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
А еще можно ходить на голове
Использовать битовое поле то проще
Я просто не знал про bitset и что vector<bool> - частный случай и там 1 элемент должен занимать 1 бит (при правильной реализации). Но и там, как я понял, используется что-то вроде предложенного мной способа, только самому не надо велосипед изобретать.
pu4koff вне форума Ответить с цитированием
Старый 25.03.2009, 13:45   #8
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Я тоже не знал про это, но уж явно, в итоге размер переменной будет не менее 1 байта
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 25.03.2009, 13:54   #9
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

zgest, все зависит от задачи. Если тебе нужен десяток флагов, используй обычный bool и не парься. Если речь идет о тысячах-миллионах флагов, бери готовый (или напиши свой) класс битового буфера, который будет сразу выделять память под все биты и иметь операции для обращения к конкретным битам.
Pashan вне форума Ответить с цитированием
Старый 25.03.2009, 14:07   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
Я тоже не знал про это, но уж явно, в итоге размер переменной будет не менее 1 байта
Я так понял, что там хранится массив слов (слово - это, допустим, тип unsigned long). Соответственно в каждом слове несколько бит хранится. Чтобы найти нужный бит, ищем сначала нужное слово (целочисленным делением индекса бита на количество бит в слове, например), а там смещениями или еще какими побитовыми операциями определяем что у нас в нужном бите этого слова записано. В общем это оптимально по объему, но не оптимально по времени. И на каждый бит проще отвести байт или даже 4 байта. Вроде как 32-разрядные процессоры лучше всего с 4-байтными числами работают и поэтому майкрософт в свое время определила BOOL как int)
В общем, судя по всему, там действительно 1 бит хранится в 1 бите, ну + "хвост" в слове, если число хранимых бит не кратно размеру слова.

Вот в Visual Studio 2005 покопался в исходниках bitset:
Код:
#define CHAR_BIT 8
typedef unsigned long _Ty;	// base type for a storage word
_Bitsperword = CHAR_BIT * sizeof (_Ty),	// bits in each word
_Words = _Bits == 0 ? 0 : (_Bits - 1) / _Bitsperword};	// NB: number of words - 1
_Ty _Array[_Words + 1];	// the set of bits
_Array - это и есть хранилище бит.

А вот установка значения бита:
Код:
	bitset<_Bits>& set(size_t _Pos,
		bool _Val = true)
		{	// set bit at _Pos to _Val
		if (_Bits <= _Pos)
			_Xran();	// _Pos off end
		if (_Val)
			_Array[_Pos / _Bitsperword] |= (_Ty)1 << _Pos % _Bitsperword;
		else
			_Array[_Pos / _Bitsperword] &= ~((_Ty)1 << _Pos % _Bitsperword);
		return (*this);
		}

Последний раз редактировалось pu4koff; 25.03.2009 в 14:16.
pu4koff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В Access есть тип данных "Счетчик".Есть ли подобный тип данных в MS Sql Server 2000? An_ton SQL, базы данных 5 16.01.2009 17:55
Как мне создать свой тип данных PilGrim Общие вопросы .NET 1 05.11.2008 19:12
Как создать базу данных? LeonKing Помощь студентам 4 07.05.2008 14:11
как правильно поставить тип данных? RedWolf Помощь студентам 4 29.12.2007 11:18
Как создать базу данных knazty Помощь студентам 15 18.11.2007 19:49