Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
#1

Пользовательские битовые флаги - C++

16.04.2013, 19:51. Просмотров 909. Ответов 12
Метки нет (Все метки)

Заинтересовала следующая конструкция:
если:
  • 1 - Девушка
  • 2 - Мужчина
  • 3 - Красивый(ая)
  • 4 - Интересный(ая)
Как передать статус объекта через 1011 ( Мужчина красивый и интересный ), как реализовать такую конструкцию чтобы каждый битовый флаг обозначался конкретный тип и после можно было при задании определенного типа делать:
C++
1
object.settype( MAN | NICE | CLEVER ); // в лучших традициях winAPI
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2013, 19:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пользовательские битовые флаги (C++):

Битовые флаги. - C++
Пожалуйста может объяснить "Пример хранения битовых флагов. Их считывание и установка." И что это такое вообще.

Байтовые флаги и битовые операции - C++
Напишите программу, в которой создайте байтовый флаг со значение "10000000" и путем выполнения битовых операций С++ измените его на...

Пользовательские флаги формата потока и манипуляторы - C++
Всем здравствуйте, возникла такая вот проблема: не понимаю как правильно создать свой флаг формата и правильно указать его для потока...

Битовые операции, битовые поля. - C++
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций. Записать в unsigned int. Использовать...

Флаги - C++
Подскажите для чего используются эти флаги: setiosflags(ios::fixed | ios::showpoint). Видел их использование совместно с setprecision(2)....

Не работают флаги - C++
#include "stdafx.h" #include <stdlib.h> #include <iostream> #include <conio.h> #include <iomanip> using namespace std; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.04.2013, 20:11 #2
Цитата Сообщение от vbloodv Посмотреть сообщение
1011 ( Мужчина красивый и интересный )
почему мужчина? 1-й бит - девушка
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
16.04.2013, 20:12  [ТС] #3
Цитата Сообщение от Jupiter Посмотреть сообщение
почему мужчина? 1-й бит - девушка
Да, вы наблюдательны и правы... Возможно знаете как такие конструкции обычно реализуют?
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
16.04.2013, 20:20 #4
Цитата Сообщение от vbloodv Посмотреть сообщение
Возможно знаете как такие конструкции обычно реализуют?
обычно так
C++
1
2
3
4
#define WOMAN 1 << 0
#define MAN 1 << 1
#define NICE 1 << 2
#define CLEVER 1 << 3
но в С++ рекомендуется использовать константы вместо макросов.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.04.2013, 20:23 #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
 
namespace flags
{
   enum attr { FEMALE = 1, MALE = 2, BEAUTIFUL = 4, INTERESTING = 8 };
}
 
bool is_female(char attr)
{
   return flags::FEMALE & attr;
}
 
bool is_male(char attr)
{
   return flags::MALE & attr;
}
 
bool is_beautiful(char attr)
{
   return flags::BEAUTIFUL & attr;
}
 
bool is_interesting(char attr)
{
   return flags::INTERESTING & attr;
}
 
int main()
{
   char attr = flags::FEMALE | flags::BEAUTIFUL | flags::INTERESTING;
   std::cout << std::boolalpha
             << "is_female: " << is_female(attr) << std::endl
             << "is_male: " << is_male(attr) << std::endl
             << "is_beautiful: " << is_beautiful(attr) << std::endl
             << "is_interesting: " << is_interesting(attr) << std::endl;
}
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
16.04.2013, 20:46  [ТС] #6
Цитата Сообщение от Jupiter Посмотреть сообщение
enum attr { FEMALE = 1, MALE = 2, BEAUTIFUL = 4, INTERESTING = 8 };
attr какого типа?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.04.2013, 20:47 #7
Биты битами, но пол разделять не стоит, а то я даже не знаю как это интерпретировать 11XX

Добавлено через 1 минуту
Цитата Сообщение от vbloodv Посмотреть сообщение
attr какого типа?
Если не особо вдаваться в подробности, то под enum'ом лежит int
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
16.04.2013, 20:51  [ТС] #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Биты битами, но пол разделять не стоит, а то я даже не знаю как это интерпретировать 11XX
Гендерная мутация, транс...
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.04.2013, 20:55 #9
Цитата Сообщение от vbloodv Посмотреть сообщение
Цитата Сообщение от Jupiter Посмотреть сообщение
enum attr { FEMALE = 1, MALE = 2, BEAUTIFUL = 4, INTERESTING = 8 };
attr какого типа?
attr это и есть имя типа перечисления в приведенной строке
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
16.04.2013, 20:58 #10
Цитата Сообщение от Tulosba Посмотреть сообщение
Биты битами, но пол разделять не стоит, а то я даже не знаю как это интерпретировать 11XX
Верное замечание, можно сделать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
namespace flags
{
   enum attr { FEMALE = 1, MALE = 2, BEAUTIFUL = 4, INTERESTING = 8 };
   const attr error = attr(FEMALE | MALE);
}
 
// ...
 
flags::attr operator | (flags::attr left, flags::attr right)
{
    if (left ^ right == flags::error) {
        std::cout << "Are you sure?" << std::endl;
        return flags::error;
    }
 
    return flags::attr(int(left) | int(right));
}
 
int main()
{
   char error = flags::MALE | flags::FEMALE;
}
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
16.04.2013, 21:25 #11
Цитата Сообщение от Kastaneda Посмотреть сообщение
Верное замечание, можно сделать так
Зачем все эти сложности? Просто убрать лишний бит.
Kastaneda
16.04.2013, 21:31
  #12

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Зачем все эти сложности? Просто убрать лишний бит.
В Нидерландах так же думали, когда узаконивали однополые браки

Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.04.2013, 07:53 #13

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
В Нидерландах так же думали, когда узаконивали однополые браки
Это никоим образом не помешает заключать такие браки. Но бит, и геморрой с ошибками сэкономит.



Добавлено через 10 часов 6 минут
И помимо 11XX, нужно еще и 00XX обрабатывать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2013, 07:53
Привет! Вот еще темы с ответами:

Флаги выравнивания - C++
Просветите пожалуйста ) :wall: Как выровнять по левому краю такое : cout&lt;&lt;&quot;S=&quot;&lt;&lt;S&lt;&lt;&quot;\n&quot;; ? Вот участок кода: void Figura::show_S() ...

Флаги (вывод сообщения) - C++
Есть программа, которая записывает в файл, считывает, удаляет и т.д. Это кусок функции удаления. Пользователь вводит фамилию...

что такое флаги? - C++
что такое флаги?

Манипуляторы и флаги формата - C++
1.Манипулятор right почемуто не производит вывод по правой стороне. В чем проблема? рис. 1 2.Манипулятор skipws должен отбрасывать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.04.2013, 07:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru