флаг битовый, избегая столкновений, C - PullRequest
2 голосов
/ 30 ноября 2011

У меня есть целое число, содержащее флаг, с существующим набором возможных флагов:

#define MAIL_ADDR_FROM  0x0001  /* address field contains the from address */
#define MAIL_ADDR_TO    0x0002  /* address field contains the to address */
#define MAIL_SEEN       0x0004  /* message has been read by the user */
#define MAIL_ATTACH     0x0008  /* message has an attachment */
#define MAIL_IMP_HIGH   0x0010  /* message is of high importance */
#define MAIL_IMP_LOW    0x0020  /* message is of low importance */
#define MAIL_FLAGGED    0x0040  /* message has been flagged */
#define MAIL_REPLIED    0x0080  /* message has been replied to */
#define MAIL_DRAFT      0x0100  /* message is a draft */
#define MAIL_NEW        0x0200  /* message is new */
#define MAIL_DELETED    0x8000  /* message is deleted */

Мне нужно добавить новый:

#define MAIL_SPAM       0x????  /* message is spam */ 

Есть липричина, по которой существующий список флагов пропускает с 0x0200 до 0x8000?Насколько я понимаю, используемые значения для моего нового флага будут 0x0400, 0x0800 и 0x1000-0x4000.Я что-то неправильно понимаю о том, как работают эти наборы битов?

Ответы [ 5 ]

3 голосов
/ 30 ноября 2011

В двух словах, ваше понимание в порядке.

Мы можем только догадываться, почему MAIL_DELETED равно 0x8000, а не, скажем, 0x0400; я думаю, что старший бит был выбран из-за драматического характера флага «удалено».

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

2 голосов
/ 30 ноября 2011

Все зависит от того, кто это написал, и что они имели в виду под выбранными битовыми позициями.Однако из того, что я вижу, похоже, что они сгруппировали битовые флаги логически в байты.

Для вас вы можете привести пример:

#define MAIL_SPAM        0x0400 /* message is spam */

Поскольку это выглядит как состояниепохож на Новый или Черновик, но не Удален.

2 голосов
/ 30 ноября 2011

Да, вы правы - эти пропущенные значения флага теоретически можно использовать, если они не зарезервированы для чего-то другого.

Вам нужно было бы уточнить у оригинального автора, есть ли какая-то конкретная причина, по которой они были пропущены и сразу достигли 0x8000.

В битовых полях, безусловно, отсутствует внутреннее поведение, которое мешало бы их использованию.

0 голосов
/ 30 ноября 2011

Звучит как плохая документация для меня.Я поместил бы MAIL_FLAG_UNUSED в последние несколько битовых слотов, чтобы было очевидно, что они были доступны.Убедитесь, что MAIL_NEW не использует старшие биты для некоторого встроенного значения, но на первый взгляд у вас действительно есть набор битов, доступных с 0x0400 по 0x4000.

0 голосов
/ 30 ноября 2011

Я не знаком с вашим приложением, но теоретически значения 0x400,0x800,0x1000,0x2000 и 0x4000 не определены и идеально подходят для других ваших определений, поэтому вы можете добавить новое определение с этими значениями.

...