История изменений
Исправление
kostyarin_,
(текущая версия)
:
Или для тех, кто врубился много лет назад, но все равно предпочитает чтобы в коде были человекочитаемые методы вместо операторов (которые в разных языках еще и разные).
Стиль программирования никто не отменял. Если у Вас одно вхождение – почему бы и не сделать его на операторах. Если оно слишком сложное – почему бы и не расписать его на несколько строк, констант и прокомментировать.
Читаемость кода не в битах, которые типа видны. На самом деле вот такая вот штука
val = 0b0000100
вообще не читаема по сравнению с
val = (1 << 2)
Т.к. считать нули и единицы при этом нет никакой необходимости.
Ну и разумеется, если вхождений много – почему бы не завернуть их в функцию или макрос – нет проблем. Просто в Си есть битовые поля или как их там. И, честно говоря, тема больше вызывает вопросов.
Обычно речь идёт о какой-то маске. Или о каком-то бите (флагах). Ну или преобразовании числа в набор байтов для пересылке по сети.
Кто работает с float point в своём представлении, то это вопрос отдельный. Т.к. я с таким не сталкивался. Где-то читал, что для тестирования (+0 там или -0) используется 16-ричное представление. Я в общем не в курсе.
Набор флагов это вообще дело обычное (должно преподаваться в детском саду)
#define THE_LIB_ENABLE_ONE (1 << 0) // 0x01
#define THE_LIB_ENABLE_TWO (1 << 1) // 0x02
#define THE_LIB_ENABLE_THREE (1 << 2) // 0x04
#define THE_LIB_ENABLE_FOUR (1 << 3) // 0x08
// [...]
int
with_flags (int val, int flags) {
return val | flags;
}
bool
is_flag_set (int val, int flag) {
return val & flag; // (val & flag) != 0
}
// [...]
val = with_flags (val, THE_LIB_ENABLE_TWO | THE_LIB_ENABLE_FOUR);
// [...]
if (is_flag_set (val, THE_LIB_ENABLE_TWO | THE_LIB_ENABLE_FOUR)) {
// stuff
}
Необходимость использовать такое дерьмо 0b0000100
говорит о том, что программист нафиг слал бизнес-логику. Что и есть основа говнокода.
Исходная версия
kostyarin_,
:
Или для тех, кто врубился много лет назад, но все равно предпочитает чтобы в коде были человекочитаемые методы вместо операторов (которые в разных языках еще и разные).
Стиль программирования никто не отменял. Если у Вас одно вхождение – почему бы и не сделать его на операторах. Если оно слишком сложное – почему бы и не расписать его на несколько строк, констант и прокомментировать.
Читаемость кода не в битах, которые типа видны. На самом деле вот такая вот штука
val = 0b0000100
вообще не читаема по сравнению с
val = (1 << 2)
Т.к. считать нули и единицы при этом нет никакой необходимости.
Ну и разумеется, если вхождений много – почему бы не завернуть их в функцию или макрос – нет проблем. Просто в Си есть битовые поля или как их там. И, честно говоря, тема больше вызывает вопросов.
Обычно речь идёт о какой-то маске. Или о каком-то бите (флагах). Ну или преобразовании числа в набор байтов для пересылке по сети.
Кто работает с float point в своём представлении, то это вопрос отдельный. Т.к. я с таким не сталкивался. Где-то читал, что для тестирования (+0 там или -0) используется 16-ричное представление. Я в общем не в курсе.
Набор флагов это вообще дело обычное
#define THE_LIB_ENABLE_ONE (1 << 0) // 0x01
#define THE_LIB_ENABLE_TWO (1 << 1) // 0x02
#define THE_LIB_ENABLE_THREE (1 << 2) // 0x04
#define THE_LIB_ENABLE_FOUR (1 << 3) // 0x08
// [...]
int
with_flags (int val, int flags) {
return val | flags;
}
bool
is_flag_set (int val, int flag) {
return val & flag; // (val & flag) != 0
}
// [...]
val = with_flags (val, THE_LIB_ENABLE_TWO | THE_LIB_ENABLE_FOUR);
// [...]
if (is_flag_set (val, THE_LIB_ENABLE_TWO | THE_LIB_ENABLE_FOUR)) {
// stuff
}
Необходимость использовать такое дерьмо 0b0000100
говорит о том, что программист нафиг слал бизнес-логику. Что и есть основа говнокода.