Классическая проблема тестирования и установки отдельных бит в целых числах в C, пожалуй, является одним из наиболее распространенных навыков программирования на промежуточном уровне. Вы устанавливаете и тестируете с помощью простых битовых масок, таких как
unsigned int mask = 1<<11;
if (value & mask) {....} // Test for the bit
value |= mask; // set the bit
value &= ~mask; // clear the bit
An интересный пост в блоге утверждает, что это склонность к ошибкам, сложность в обслуживании и плохая практика. Сам язык C предоставляет доступ к битовому уровню, который является типичным и портативным:
typedef unsigned int boolean_t;
#define FALSE 0
#define TRUE !FALSE
typedef union {
struct {
boolean_t user:1;
boolean_t zero:1;
boolean_t force:1;
int :28; /* unused */
boolean_t compat:1; /* bit 31 */
};
int raw;
} flags_t;
int
create_object(flags_t flags)
{
boolean_t is_compat = flags.compat;
if (is_compat)
flags.force = FALSE;
if (flags.force) {
[...]
}
[...]
}
Но это делает меня cringe.
Интересный аргумент, который у меня был у моего коллеги и у меня об этом, до сих пор не решен. Оба стиля работают, и я поддерживаю классический метод битмаски, это легко, безопасно и понятно. Мой коллега согласен с тем, что он распространен и прост, но метод объединения битбитов стоит лишних строк, чтобы сделать его переносимым и безопасным.
Есть ли еще какие-либо аргументы для обеих сторон? В частности, существует ли какой-либо возможный сбой, возможно, с контентом, который может пропустить метод битмаски, но где безопасный структурный метод?