Использование битовых полей структуры - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Многие не рекомендуют использовать битовые поля структуры. Нашел этому пока одно объяснение. "На одних машинах поля размещаются слева направо, на других — справа налево." и если данные для битовых полей присылает внешний источник, то такая программа считается не переносимой ввиду того, что порядок присылаемых битов извне может быть разным. Но что если использовать битовые поля структуры просто в качестве флагов истина/ложь и задавать их явно в программе? Можно ли в таком случае расчитывать на то, что битовые поля будут корректно хранить флаги истина/ложь на всех машинах? Пример
#include  <stdio.h>
 
struct Work
{
    unsigned int is_started : 1;
    unsigned int is_finished : 1;
    unsigned int state : 1;
};
 
int main(void)
{
    struct Work w;
    w.is_started = 1;
    w.is_finished = 0;
    w.state = 0;
 
    printf("%d %d %d", w.is_started, w.is_finished, w.state);
    return 0;
}

Решение задачи: «Использование битовых полей структуры»

textual
Листинг программы
struct S s[100];
 
process_structures(s, 100, IS_RED | IS_GREEN, IS_GREEN);
/* Обработать только элементы, где выставлен флаг IS_GREEN и сброшен флаг IS_RED */
 
process_structures(s, 100, IS_BLUE, 0);
/* Обработать только элементы, где сброшен флаг IS_BLUE */
 
process_structures(s, 100, IS_RED | IS_GREEN | IS_BLUE, IS_RED | IS_GREEN | IS_BLUE);
/* Обработать только элементы, где выставлены все три флага */

Объяснение кода листинга программы

  1. Объявляется массив структур S с размером 100.
  2. Вызывается функция process_structures для первого элемента массива s.
  3. В функции process_structures проверяется, выставлен ли флаг IS_GREEN и сброшен ли флаг IS_RED.
  4. Если это так, то выполняется обработка этого элемента.
  5. Выполняется обработка остальных элементов массива s, где выставлен флаг IS_GREEN и сброшен флаг IS_RED.
  6. Вызывается функция process_structures для первого элемента массива s.
  7. В функции process_structures проверяется, сброшен ли флаг IS_BLUE.
  8. Если это так, то выполняется обработка этого элемента.
  9. Выполняется обработка остальных элементов массива s, где сброшен флаг IS_BLUE.
  10. Вызывается функция process_structures для первого элемента массива s.
  11. В функции process_structures проверяется, выставлены ли все три флага (IS_RED, IS_GREEN, IS_BLUE).
  12. Если это так, то выполняется обработка этого элемента.
  13. Выполняется обработка остальных элементов массива s, где выставлены все три флага (IS_RED, IS_GREEN, IS_BLUE).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5
Похожие ответы