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

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

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

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

С

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

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

textual
Листинг программы
#include <stdio.h>
#include <limits.h>
 
#define ENABLE      0x01
#define DISABLE     0x00
 
typedef union {
    short field;
    struct {
        unsigned field1:8;
        unsigned field2:1;
        unsigned field3:2;
        unsigned field4:1;
        unsigned field5:2;
        unsigned field6:1;
    } fields;
} STRUCT;
 
void print(unsigned short n) {
    for(int i = sizeof(short) * CHAR_BIT - 1; i >= 0; --i) {
        printf("%d%s", n&(1 << i) ? 1 : 0, i%4 ? "" : " ");
    }
    printf("\n");
}
 
int main(void) {
    STRUCT st = {0};
    print(st.field);
    st.fields.field1 = 0xAA;
    print(st.field);
    st.fields.field2 = ENABLE;
    print(st.field);
    st.fields.field3 = 0x01;
    print(st.field);
    st.fields.field4 = DISABLE;
    print(st.field);
    st.fields.field5 = 0x03;
    print(st.field);
    st.fields.field6 = ENABLE;
    print(st.field);
 
    return 0;
}

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

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

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


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

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

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