Создать структуру для работы с битами - 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; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Определяем макросы для удобства работы со значениями полей структуры
- Создаем структуру с именем
STRUCT
, которая содержит короткое поле и набор полей битов - Функция
print
принимает на вход 16-битное число и выводит его в двоичном виде, используя операторprintf
- В функции
main
создаем экземпляр структурыSTRUCT
с именемst
и инициализируем его нулевым значением - Вызываем функцию
print
для вывода начального значения поляst
- Изменяем значения полей структуры
st
и каждое изменение подтверждается вызовом функцииprint
- Возвращаем 0, чтобы указать, что программа успешно завершилась
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д