Создать структуру для работы с битами - 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, чтобы указать, что программа успешно завершилась
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д