Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB_TO2.doc
Скачиваний:
15
Добавлен:
19.02.2016
Размер:
2.62 Mб
Скачать

6 Контрольні запитання

        1. В чому різниця між функціями розподілу пам’яті. malloc() і calloc()?

        2. З допомогою якої функції звільняється пам’ять?

        3. Що таке динамічний розподіл пам’яті?

        4. В чому різниця між структурою і масивом. ?

        5. Яким символом позначається операція звернення до елементу структури?

        6. З допомогою якого ключового слова описується структура?

Лабораторна робота № 20

Тема: Операції над окремими бітами пам’яті.

Мета роботи: Навчитись оперувати з окремими бітами пам’яті і виконувати операції над ними.

1 Короткі теоретичні відомості

Елементарною одиницею збереження інформації є біт. Бітові (двійкові, порозрядні) операції дають можливість маніпулювати окремими бітами цілочисельних змінних. Біт може приймати 0 або 1. Порозрядні операції можна виконати тільки над цілочисельними типами int, long i char.

Операції порозрядного зсуву. Існує дві операції для зсуву бітів в цілочисельних змінних на задане число позицій. Операція << зсуває біт вліво, а операція >> - вправо. Синтаксис

x << n ; x>> n

Кожна з операцій зсуває біти на n позицій в вказаному напрямі. При зсуві вправо n старших бітів заповнюється нулями, а при зсуві вліво заповнюються молодші біти. Наприклад,

Двійкове число 00001100 (12) при зсуві вправо на 2 розряди = 00000011 (3)

Двійкове число 00001100 (12) при зсуві вліво на 3 розряди = 01100000 (96)

Двійкове число 00001100 (12) при зсуві вправо на 3 розряди = 00000001 (1)

Двійкове число 00110000 (48) при зсуві вліво на 3 розряди = 10000000 (128)

Операції зсуву можна використати для множення і ділення цілих чисел на числа, рівні степеням 2.

Зсув на n позицій вліво еквівалентний множенню на 2n, вправо - ділення на 2n,. Результат множення може бути правильний тільки в тому випадку, коли при зсуві не пройшло переповнення, тобто ні один біт не втратився при зсуві за границі старшого розряду. Ділення шляхом зсуву вправо є цілочисельним, при якому відкидається дробова частина результату. Наприклад, при зсуві вправо число 5 (00000101) на одну позицію з метою розділити його на 2, результат буде рівний 2 (00000010), а не 2.5 Приклад програми.

#include <stdio.h>

int main( ) {

unsigned int y, x = 255;

int i;

for (i = 1; i < 8; i++)

{ y = x << i; Множення

printf("%d\t%d\t%d\n", x, i, y); }

for (i = 1; i < 8; i++)

{ y = x >> i; Ділення

printf("%d\t%d\t%d\n", x, i, y); }}

Результат

/*Десяткові Множення

255 1 510

255 2 1020

255 3 2040

255 4 4080

255 5 8160

255 6 16320

255 7 32640

/*Десяткові Ділення

255 1 127

255 2 63

255 3 31

255 4 15

255 5 7

255 6 3

255 7 1 */

Порозрядні логічгі операції. Є три логічні операції для роботи з бітами в цілочисельних змінних.

Знак операції

Суть операції

Приклад

&

Побітове логічне і (AND). Біт результату =1, якщо відповідні біти обох операндів =1 і = 0, коли один з бітів =0. Операція використовується для (відключення) очистки одного або кількох бітів цілої змінної.

11110000

&

01010101

01010000

І

Побітове логічне включаюче або (OR)

РЕЗУЛЬТАТ =0, КОЛИ ВІДПОВІДНІ БІТИ ОБОХ ОПЕРАНДІВ =0. операція використовується для включення (установки) одного або кількох бітів цілої змінної.

11110000

I 01010101

11110101

^

Побітове логічне виключаюче або (XOR). Біт результату =1, якщо відповідні біти обох операндів різні. Інакше вона =0.

11110000

^ 01010101

10100101

Це порозрядні операції, які роблять біти результату = 0 або 1 в залежності від значень бітів в операндах.

Що ж означає включення-відключення заданих бітів цілої змінної. Нехай є змінна типу char і нам треба очистити (тобто зробити їх нульовими) 0 і 4 біти, залишивши останні незмінними. Виконаємо операцію логічного І нашого числа з двійковим числом 11101110. Тоді в кожній позиції, де в другому числі є одиниця, результат збережеться, позиція , де в другому числі є 0, результат буде нульовим.

Установка (включення) бітів з допомогою операції або виконується аналогічно. В позиції, де 2 число 1 результат буде 1, де в другому числі 0, результат незмінним.

0101

1100

==

1101

Операція доповнення. Це унарна операція, яка полягає в перетворенні бітів операнда на протилежні.

Бітові поля в структурах. Використання бітових полів економить пам’ять при роботі зі структурами. Бітове поле - це елемент структури, який складається з заданої кількості бітів.

Багато полів, особливо в базах даних мають відповіді так або ні. Найкоротший тип є тип char, який займає 8 бітів. Тоді сім бітів буде пропадати. Використання бітових полів дозволить помістити в одну змінну типу char 8 відповідей так або ні. Бітові поля можна використати і там, де нам потрібні числа 1, 2, 3, які представляються 2 бітами. 3 бітами - числа від 0 до 7, 4 бітами - числа від 0 до 15. Задання бітових полів і звертання до них не відрізняється від звичайних змінних.

Бітові поля мають тип unsigned int, а розмір задається після двокрапки, яка стоїть за іменем поля. Наприклад:

struct data

{ unsigned a1:1;

unsigned a2:2;

unsigned a3:3; }

Бітові поля - це невеликі цілі числа без знаку, з заданою кількістю двійкових розрядів, в структурі мають бути спочатку, перед іншими елементами. Бітові поля довжиною n біт можуть містити числа з діапазону від 0 до 2n+1. Якщо в таке поле помістити число, яке не входить в заданий діапазон, то компілятор не видасть помилки, а програма дасть не передбачені результати. Не рекомендується задавати бітові поля довжиною 8 або 16 байт, бо для цього є стандартні типи даних.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]