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