Позволяет удалить код:
mode = (((uint8_t) Flags.flag4 << 1) | (uint8_t) Flags.flag3)); </p>
Первый:
(uint8_t)Flags.flag4
(uint8_t)Flags.flag3
Flags.flag4 и Flags.flag3 приводятся к uint8_t.Эта часть важна.В то время как Flags.flag4 и Flags.flag3 имеют только один бит, преобразование преобразует его в полные 8 бит.
Next:
((uint8_t)Flags.flag4 << 1)
Это сдвигает значение flag4 на 1 бит влево,Это так же, как x * 2
.Помните, что актеры превратили это в целые 8 битов.Таким образом, сдвиг не переполняется.flag4 может быть только 0 или 1, поэтому после сдвига это будет 0 или 2.
Последнее два значения объединяются в одну.Это дает результат 0-3 в зависимости от значений flag3 и flag4.
Обратите внимание на альтернативный способ написать это, хотя для архитектуры / ABI характерно использование
struct {
uint8_t flag1:1;
uint8_t flag2:1;
union {
struct {
uint8_t flag3:1;
uint8_t flag4:1;
};
uint8_t flag34:2;
};
} Flags;
Порядокflag3 и flag4 в памяти разделены в соглашениях о вызовах архитектуры / ABI, поэтому flag34 не так переносим.Возможно, вам придется изменить флаги, чтобы получить оптимальный результат (самая короткая / самая быстрая сборка).