Создать структуру для работы с битами - C (СИ)

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

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

Всем добра Есть такая проблемка, сейчас постараюсь описать её. Допустим есть целое число типа int. И пусть оно длиной 16 бит. в двоичном представлении оно наверяка будет выглядеть так (если оно равно 0)
0000 0000 0000 0000
. биты нумерутся от 0 до 15 как сделать в

С

(именно С а не С++) структуру для работы с этими битами такого плана.
Листинг программы
  1. typedef struct
  2. {
  3. Поле1 : меняет биты с 0 до 7 (допустим сюда можно записать 8 битное число)
  4. Поле2 : меняет 8 бит
  5. Поле3 : меняет 9 и 10 бит
  6. Поле4 : меняет 11 бит
  7. Поле5 : меняет 12 и 13 бит
  8. Поле6 : меняет 14 бит
  9. /** 15-й бит допустим не используется */
  10. } STRUCT;
и чтобы её можно было применять так
Листинг программы
  1. STRUCT.Поле1 = Какая_то_переменная_размеромм_8_бит /** например значение её 0011 1101 */
  2. STRUCT.Поле2 = ENABLE; /** как-то опредлить ENABLE и DISABLE как 1 и 0 */
  3. STRUCT.Поле3 = /** сюда как-нибудь записать два бита, например 01 */
  4. STRUCT.Поле4 = DISABLE;
  5. STRUCT.Поле5 = /** сюда опять как-нибудь записать два бита, например 11 */
  6. STRUCT.Поле6 = ENABLE;
и после этих манипуляций должны записаться все биты, которые мы записывали через поля, т.е. результат такой
00111101 1 01 0 11 1 0
пробелами выделила Поля, первая цепочка цифр (00111101) это Поле1, вторая (1) - это Поле2 и т.д. Но если я не использую какие-нибудь поля, то на месте этих битов ничего не записывается догадываюсь, что надо использовать побитовые операции сдвига и прочие побитовые штуковины, но как реазлизовать такое - незнаю.. если кто сможет, то помогите пожалуйста

Решение задачи: «Создать структуру для работы с битами»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <limits.h>
  3.  
  4. #define ENABLE      0x01
  5. #define DISABLE     0x00
  6.  
  7. typedef union {
  8.     short field;
  9.     struct {
  10.         unsigned field1:8;
  11.         unsigned field2:1;
  12.         unsigned field3:2;
  13.         unsigned field4:1;
  14.         unsigned field5:2;
  15.         unsigned field6:1;
  16.     } fields;
  17. } STRUCT;
  18.  
  19. void print(unsigned short n) {
  20.     for(int i = sizeof(short) * CHAR_BIT - 1; i >= 0; --i) {
  21.         printf("%d%s", n&(1 << i) ? 1 : 0, i%4 ? "" : " ");
  22.     }
  23.     printf("\n");
  24. }
  25.  
  26. int main(void) {
  27.     STRUCT st = {0};
  28.     print(st.field);
  29.     st.fields.field1 = 0xAA;
  30.     print(st.field);
  31.     st.fields.field2 = ENABLE;
  32.     print(st.field);
  33.     st.fields.field3 = 0x01;
  34.     print(st.field);
  35.     st.fields.field4 = DISABLE;
  36.     print(st.field);
  37.     st.fields.field5 = 0x03;
  38.     print(st.field);
  39.     st.fields.field6 = ENABLE;
  40.     print(st.field);
  41.  
  42.     return 0;
  43. }

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

  1. Включаем необходимые заголовочные файлы
  2. Определяем макросы для удобства работы со значениями полей структуры
  3. Создаем структуру с именем STRUCT, которая содержит короткое поле и набор полей битов
  4. Функция print принимает на вход 16-битное число и выводит его в двоичном виде, используя оператор printf
  5. В функции main создаем экземпляр структуры STRUCT с именем st и инициализируем его нулевым значением
  6. Вызываем функцию print для вывода начального значения поля st
  7. Изменяем значения полей структуры st и каждое изменение подтверждается вызовом функции print
  8. Возвращаем 0, чтобы указать, что программа успешно завершилась

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


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

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

13   голосов , оценка 3.846 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы