Размещение битовых полей в памяти
От реализации зависит порядок размещения в памяти полей одной структуры. Поля могут размещаться как слева направо, так и справа налево. Любой код программ, использующий битовые поля, зависит от компьютера и компилятора.
Пример 2.
#include <stdio.h>
struct expl {
int i:2;
unsigned j:2;
int :2;
int k:2;
int dummy: 8;
} my;
void main() {
my.dummy = 0;
my.i = 1;
my.j = 3;
my.k = -1;
printf("%d\n", my);
printf("Поля: %d\t%d\t%d", my.i, my.j, my.k);
}
Следующий рисунок показывает, как выглядит переменная my в памяти.
… | ||||||||||||
… | ||||||||||||
dummy | k | j | i |
Пример 3. Иллюстрация возможностей объединений и структур с битовыми полями.
В программе вводятся значения двух целых переменных m и n, и остатки от их деления на 16 заносятся соответственно в четыре младших и в четыре старших разряда одного байта. Таким образом, выполняется некоторая кодировка введенных значений переменных m и n. Затем печатается изображение содержимого сформированного байта.
Обратите внимание на использование объединения. В функции cod() запись данных производиться в элементы (битовые поля) структуры hh, входящей в объединение un, а результат выбирается из того же объединения un в виде одного байта. В функции binary() происходит обратное преобразование – в нее как значение параметра передается байт, содержимое которого побитово «расшифровывается» за счет обращения к отдельным полям структуры byte, входящей в объединение cod.
//Структуры, объединения и битовые поля
#include <stdio.h>
void binar (unsigned char); //прототип функции
unsigned char cod (int, int); // прототип функции
void main() {
unsigned char k;
int m, n;
printf("m=");
scanf("%d", &m);
printf("n=");
scanf("%d", &n);
k=cod(m,n);
printf("cod=%u\n", k);
binar(k);
}
//Упаковка в один байт остатков от деления на 16 двух целых чисел
unsigned char cod (int a, int b) {
union {
unsigned char z;
struct {
unsigned int x : 4;//младшие биты
unsigned int y : 4;//старшие биты
} hh;
} un;
un.hh.x=a%16;
un.hh.y=b%16;
return un.z;
}
//двоичное представление байта
void binar (unsigned char ch) {
union {
unsigned char ss;
struct {
unsigned a0 : 1;
unsigned a1 : 1;
unsigned a2 : 1;
unsigned a3 : 1;
unsigned a4 : 1;
unsigned a5 : 1;
unsigned a6 : 1;
unsigned a7 : 1;
} byte;
} cod;
cod.ss=ch;
printf("Номер битов: 7 6 5 4 3 2 1 0\n");
printf("Значение битов: %d %d %d %d %d %d %d %d\n",
cod.byte.a7, cod.byte.a6, cod.byte.a5, cod.byte.a4,
cod.byte.a3, cod.byte.a2, cod.byte.a1, cod.byte.a0);
}
Результат выполнения программы:
Первый вариант
m=1
n=3
cod=49
Номер битов: 7 6 5 4 3 2 1 0
Значение битов: 0 0 1 1 0 0 0 1
Второй вариант
m=0
n=1
cod=16
Номер битов: 7 6 5 4 3 2 1 0
Значение битов: 0 0 0 1 0 0 0 0
Задания
1.Наберите коды программ из Примеров 1 и 2. Выполните компиляцию и запуск программ.
2.Разработайте структуру, используя битовые поля для обозначения логических (битовых) значений. Структура Магазин: Наименование товара, Цена, Страна производства, Наличие в магазине, Соответствие стандарту РФ, Является товаром месяца. Объявите и заполните массив из пяти структур. Распечатайте информацию обо всех введенных товарах. Распечатайте информацию об имеющихся в магазине товарах, не соответствующих стандарту РФ.
3.Используя объединение с битовыми полями, определите четность беззнакового целого числа по анализу старшего бита (операцию деления с остатком не использовать).
Домашние задания
1.Наберите код программы из Примера 3. Выполните компиляцию и запуск программы.
2.Разработайте структуру, используя битовые поля для обозначения логических (битовых) значений. Структура Военкомат: Фамилия, Имя, Отчество, Год рождения, Гражданство, Военнообязанный, Наличие отсрочки от службы в ВС, Годен к службе в ВС. Объявите и заполните массив из пяти структур. Распечатайте весь массив. Распечатайте информацию обо всех военнообязанных гражданах РФ, годных к службе в ВС.
3.Используя объединение с битовыми полями, определите кратность 8 беззнакового целого числа по анализу старших битов (операцию деления с остатком не использовать).
Дата добавления: 2015-02-16; просмотров: 875;