Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объявление битов константами 
:(
    Опции темы
supercelt
Дата 19.9.2015, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 25.8.2005

Репутация: нет
Всего: 1



Привет, такой вопрос. Есть переменная
Код

char x; //1 байт или 8 бит

Эта переменная будет использоваться как 8 флагов для разного назначения и по ходу программы туда будут записываться 0 и 1 в нужный бит.
Как мне присвоить имена этим битам что бы обращаться к ним, записать туда.
Например я записываю в 0 бит 1
Код

x |= (1 << 0);


А я хочу присвоить некое имя именно одному биту только этой переменной. Например 0 бит я назвал Flag
И я хочу узнать 1 там или нет
Код

if(Flag)

Короче говоря нужно присвоить так, что бы программа знала, что Flag - это именно нулевой бит переменной х. 
И вопрос тогда как осуществлять запись в этот бит?
PM   Вверх
feodorv
Дата 19.9.2015, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Не знаю, насколько правильно понял вопрос. В C обычно пишут что-то вроде:
Код
#define FLAG_NAME_ONE 0x01u
#define FLAG_NAME_TWO 0x02u
#define FLAG_NAME_THREE 0x04u
// и т.д.
Можно даже заморочиться поболее:
Код
#define flagsSet(x,y) ((x) |= (y))
#define flagsCheck(x,f) ((x) & (f))
#define flagsUnset(x,f) ((x) &= ~(f))
#define flagsLeave(x,f) ((x) &= (f))
#define flagsHas(x,f) (((x) & (f)) == (f))
#define flagsTest(x,f,t) (((x) & (f)) == (t))
тогда код приобретает такой вид:
Код
if( flagsCheck( x, FLAG_NAME_TWO | FLAG_NAME_THREE) )
  flagsUnset( x, FLAG_NAME_ONE);
В C++ пользуются неймспейсами и константными величинами.


Цитата(supercelt @  19.9.2015,  00:30 Найти цитируемый пост)
char x;

Для хранения флагов я бы всё таки пользовался unsigned переменными.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
_zorn_
Дата 19.9.2015, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1076
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Можно в дефайнах, но не помню как )
byte getBit(int src, byte num){
  return (src >> num) & 1;
}
Мля. SetBit посложнее будет ))

Это сообщение отредактировал(а) _zorn_ - 19.9.2015, 07:41
PM MAIL   Вверх
_zorn_
Дата 19.9.2015, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1076
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



int setBit(int src, byte bitNum, byte set){
  int mask = 1 << bitNum;
  return set ? src | mask : src & ^mask;
}
PM MAIL   Вверх
volatile
Дата 19.9.2015, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Код

struct {
   int one:1;
   int two:1;
   int three:1;
} flags;

запись бита:
Код

flags.one = 1;

чтение бита:
Код

var = flags.one;

 smile 
PM MAIL   Вверх
supercelt
Дата 19.9.2015, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 25.8.2005

Репутация: нет
Всего: 1



Цитата(volatile @ 19.9.2015,  11:19)
Код

struct {
   int one:1;
   int two:1;
   int three:1;
} flags;

Я так понял что one, two, three каждый занимает 1 байт? Или всё-таки 1 бит?
PM   Вверх
volatile
Дата 19.9.2015, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(supercelt @  19.9.2015,  12:22 Найти цитируемый пост)
каждый занимает 1 байт? Или всё-таки 1 бит? 

1 бит

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0452 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.