PDF

Štruktúra záznam. Operácie s bitovými údajmi

Formát
PDF
Veľkosť
71 kB
Pridané
Stiahnutí
1 127
Hodnotenie
5,0/5
Stiahnuť PDF · 71 kB

Preber si túto poznámku so svojou AI

Skopíruj pripravený podklad a vlož ho do ChatGPT, Claude alebo inej AI — bude ťa učiť alebo skúšať len z tejto poznámky.

Otvoriť AI: ChatGPT · Claude · Gemini

Náhľad poznámky

Programovanie - prednáška

č. 8

1

Štruktúra záznam

Operácie s bitovými údajmi

1. Štruktúra záznam

zložený typ štruktúry záznam

varianty štruktúr záznam

reprezentácia štruktúry záznam

použitie štruktúry záznam v jazyku C

2. Operácie s bitovými údajmi

operácie s bitovými údajmi v jazyku C

operátory a výrazy s bitovými údajmi

bitové polia

Programovanie - prednáška

č. 8

2

Štruktúrované údajové objekty

• Najbežnejší spôsob vytvárania štruktúrovaných

typov

Spájanie ľubovoľných prvkov (zložiek) do

zložených typov

• Príklady

– komplexné čísla zložené z dvoch reálnych čísel
– súradnice bodov zložené z dvoch alebo viacerých

reálnych čísel

– opis osoby pomocou niekoľkých charakteristík (meno,

dátum narodenia, pohlavie, atď.)

Programovanie - prednáška

č. 8

3

Zložený typ

• Zložený typ je kartziánsky súčin jeho

zložkových typov

Množina hodnôt zloženého typu je tvorená

všetkými možnými kombináciami hodnôt
jednotlivých typov zložiek

Kardinalita zloženého typu je daná

súčinom kardinalít typov zložiek

Programovanie - prednáška

č. 8

4

Štruktúra záznam

• V oblasti spracovania údajov sa zložené typy

používajú na štruktúrovaný opis osôb alebo
predmetov

– zaznamenávajú podstatné charakteristiky osôb alebo

predmetov

• Najčastejšie sa tieto údaje vyskytujú ako záznamy

v súboroch alebo databázach

• Pri opise zložitých štruktúr takejto povahy

uprednostňujeme termín záznam pred pojmom
karteziánsky súčin

Programovanie - prednáška

č. 8

5

Definícia štruktúry záznam

Definícia štruktúry záznam (zjednodušene štruktúry) v jazyku C

struct [názov] {

typ

1

zložka

1;

typ

2

zložka

2;

...

typ

n

zložka

n;

} [zoznam_premenných];

Ak je definovaný názov štruktúry, môžeme ho použiť ako nový typ na
definíciu ďalších premenných

struct názov zoznam_premenných;

Programovanie - prednáška

č. 8

6

Príklady použitia

Reprezentácia súradníc bodu štruktúrou

struct bod {

double x;

double y;

};

Definícia konkrétnych bodov pomocou štruktúry

struct bod a;
struct bod b = {10, 20};

Reprezentácia osoby štruktúrami

struct datum { int den, mesiac, rok };
struct osoba {

char meno[30];
struct datum datum_narodenia;

unsigned long evidencne_cislo;

};

Definícia konkrétnych osôb a dátumov pomocou štruktúr

struct osoba zamestnavatel, zamestnanci[20], *p;
struct datum dnes, splatnost;

Programovanie - prednáška

č. 8

7

Výber zložiek štruktúry záznam

Identifikátory zložiek záznamov sú uvedené v rámci definície
zloženého typu

Prístup ku zložkám je možný pomocou operátora sprístupnenia zložky
záznamu (selektora) aplikovaného na premenné typu záznam

premenná.zložka

i

Príklady

a.x

zamestnavatel.meno

zamestnanec[i].datum_narodenia.mesiac

dnes.den

Programovanie - prednáška

č. 8

8

Výber zložiek štruktúry záznam

Ak je premenná typu záznam definovaná ako smerník na štruktúru
záznam
, môžeme použiť namiesto

(*smerník).zložka

i

iný operátor výberu zložky záznamu pre jednoduchší zápis

smerník->zložka

i

Príklad

p->meno

Programovanie - prednáška

č. 8

9

Vlastnosti štruktúr záznam

Ľubovoľný prístup k jednotlivým zložkám, podobne aj v poli

Všeobecnejšia ako pole, pretože jednotlivé zložky nemusia byť
rovnakého typu

Selektory zložiek záznamov sú pevne dané identifikátormi v rámci
definície záznamu

– pri použití poľa môžu byť selektory (indexy) vypočítateľné hodnoty, čo je

flexibilnejší prístup

So štruktúrami pracujeme ako s celkom, môžeme ich kopírovať resp.
priraďovať ako celok

Môžeme získať adresu štruktúry a pracovať so smerníkom na štruktúru

– pri použití štruktúr ako parametrov funkcií si treba uvedomiť, že sa

odovzdávajú ako jedna komplexná hodnota, ktorá sa musí celá
prekopírovať

– je efektívnejšie odovzdávať smerníky na štruktúry, to isté platí o

odovzdávaní štruktúry ako návratovej hodnoty funkcie

Programovanie - prednáška

č. 8

10

Varianty štruktúr záznam

• Z praktického hľadiska je výhodné považovať dva

typy za varianty toho istého typu

• Napr. typ súradnice môžeme považovať za

zjednotenie dvoch variantov – kartéziánskej (dve
dĺžky) a polárnej (jedna dĺžka, jeden uhol)
súradnicovej sústavy

• Takáto definícia štruktúry záznam umožňuje, aby

údajový objekt bol interpretovaný rôznym
spôsobom

• Kardinalita takejto štruktúry je daná súčtom

kardinalít jednotlivých typov variantov

Programovanie - prednáška

č. 8

11

Definícia štruktúry záznam

s variantmi

Definícia štruktúry záznam s variantmi (zjednodušene union) v jazyku C

union [názov] {

typ

1

zložka

1;

typ

2

zložka

2;

...

typ

n

zložka

n;

} [zoznam_premenných];

Takto definovaný union umožňuje prístup k jednému údaju pomocou rôznych
n zložiek rôznych typov

V jazyku C je práca s unionom je rovnaká ako práca so štruktúrou

treba si uvedomi

ť, že všetky zložky unionu uchovávajú ten istý údaj a nie n

rôznych údajov

prístup ku konkrétnej zložke unionu závisí od toho, akým spôsobom chceme s
údajom pracova

ť (máme n rôznych spôsobov)

Programovanie - prednáška

č. 8

12

Príklady použitia

Pri používaní štruktúr záznam s variantmi často kombinujeme použitie
štruktúr a unionov

Pre identifikáciu konkrétnej varianty často zavádzame zložku
nazývanú diskriminátor typu alebo rozlišovacia zložka

Definícia bodu pomocou štruktúry s dvoma variantmi (karteziánske
alebo polárne súradnice)

struct bod {

enum {KARTEZIANSKE, POLARNE} druh;

union {

struct {double x, y;} kartezianske;

struct {double r, fi;} polarne;

} suradnice;

};

struct bod a;

Programovanie - prednáška

č. 8

13

Výber variantov zložiek štruktúry

Selektor pre výber jednotlivých zložiek takéhoto záznamu je daný úrov

ňami definície

jednotlivých štruktúr a unionov

a.druh

a.suradnice.kartezianske.x

a.suradnice.polarne.fi

Vo všeobecnosti môže programátor použi

ť ktorúkoľvek variantu záznamu

suradnice

,

čo môže spôsobiť vážne sémantické chyby programu

Odporú

ča sa, aby príslušné operácie s jednotlivými variantmi boli striktne rozlíšené

(použitie vetvenia) pomocou rozlišovacej zložky druh

takto môžeme v programe jednoducho overi

ť správnosť použitia selektora

sta

čí overiť, či každá vetva obsahuje iba korektné selektory

switch (a.druh) {

case KARTEZIANSKE:

printf("Kartézske: x = %g, y = %g\n",

a.suradnice.kartezianske.x, a.suradnice.kartezianske.y);

break;

case POLARNE:

printf("Polárne: r = %g,

ϕ = %g\n",

a.suradnice.polarne.r, a.suradnice.polarne.fi);

break;

}

Programovanie - prednáška

č. 8

14

Reprezentácia štruktúr záznam

Záznamy sú zobrazované do pamäti postupným zobrazovaním ich
jednotlivých zložiek

Adresu i-tej zložky záznamu vzhľadom na začiatočnú adresu záznamu
nazývame posunutie (alebo offset) a

i zložky i

a

i = s1 + s2 + ... + si – 1

pričom s

j je ve

ľkosť j-tej zložky záznamu

Celková veľkosť záznamu je daná súčtom veľkostí jej zložiek

Zložky záznamu sú prístupné len prostredníctvom presne stanovených
identifikátorov

každé s

j môže mať inú hodnotu a výpočet posunutia sa preto nedá automaticky

vypo

čítať z pozície zložky

Posunutia zložiek sú známe už počas kompilácie

nie je potrebné vykonáva

ť výpočet pozície zložky (ako napr. v prípade indexov

po

ľa) počas realizácie programu

Programovanie - prednáška

č. 8

15

Reprezentácia štruktúr záznam

s variantmi

• Štruktúra záznam s variantmi (union) reprezentuje jednu

informáciu prístupnú viacerými spôsobmi

• Z toho vyplýva, že každá zložka takéhoto unionu je

zobrazená na začiatočnej adrese celého záznamu

• Celková veľkosť unionu je daná veľkosťou najväčšej

zložky unionu

a

b

b

c

struct {

int a;

float b;

char c;

};

union {

int a;

float b;

char c;

};

a

c

Programovanie - prednáška

č. 8

16

Operácie s bitovými údajmi

• Tvorba výrazov pre vykonávanie základných

operácií s jednotlivými bitmi alebo segmentmi
bitov
(napr. bajtmi alebo bitovými poliami)

• Prostriedok pre prístup k údajom na najnižšej –

strojovej úrovni

• Používajú sa na manipuláciu bitov v rámci

údajových objektov celočíselných typov (char,
int

, long, unsigned)

Programovanie - prednáška

č. 8

17

Použitie operácií s bitmi

• Programovanie ovládačov (driver) rozličných

technických zariadení a aplikácií s priamym
prístupom k nim

• Pamäťovo úsporná implementácia logických

údajových objektov (stačí 1 bit) a údajov, ktoré
majú užší interval hodnôt, ako základné typy
(napr. pre zakódovanie 8 hodnôt nám stačia iba 3
bity)

• Programovanie emulátorov operácií v pohyblivej

rádovej čiarke, ak nie je k dispozícii príslušný
procesor

Programovanie - prednáška

č. 8

18

Bitové operátory

Operátor

Význam

Priorita

Asociatívnos

ť

~

jednotkový doplnok

14

bitov v slove

>>

posun bitov v slove

11

vpravo

<<

posun bitov v slove

11

v

ľavo

&

logický sú

čin bitov

8

dvoch slov

^

neekvivalencia bitov

7

dvoch slov

|

logický sú

čet bitov

6

dvoch slov

Programovanie - prednáška

č. 8

19

Jednotkový doplnok bitov v slove

Táto operácia vykoná inverziu všetkých bitov v slove – bit s hodnotou
1 zmení hodnotu na 0 a bit s hodnotou 0 zmení hodnotu na 1

~slovo

Používa sa tiež na vytváranie implementačne nezávislých konštánt

– slovo typu int môže byť na rôznych počítačových systémoch

implementované rôzne (napr. 16 bitové slovo alebo 32 bitové slovo)

0177777

šestnásťbitové slovo so všetkými bitmi
hodnoty 1

~0

slovo so všetkými bitmi hodnoty 1 bez ohľadu na
koľkých bitoch je implementované

Programovanie - prednáška

č. 8

20

Posun bitov v slove

Bity v slove sú posúvané o konkrétny počet v slove doprava alebo
doľava

slovo << n

slovo >> n

Posun o n bitov doľava predstavuje násobenie slova číslom 2n

Posun o n bitov doprava predstavuje delenie slova číslom 2n

Pri posune doľava sa sprava do slova nasúvajú bity s hodnotou 0

Pri posune doprava sa zľava do slova nasúva

– znamienkový bit – aritmetický posun
– bit s hodnotou 0 – logický posun
– je to implementačne závislé, pričom pre nezávislú implementáciu je

potrebné definovať slovo typu unsigned (potom sa vždy realizuje
logický posun)

Programovanie - prednáška

č. 8

21

Logický súčin bitov dvoch slov

Táto operácia vykoná logický sú

čin jednotlivých bitov na tých istých pozíciách dvoch

slov

slovo1 & slovo2

Používa sa

často na nulovanie bitov v bitovom segmente

int a;

a = a & 0177400;

spôsobí vynulovanie nižších 8 bitov v premennej a, za predpokladu, že typ int je
realizovaný na 16 bitoch

lepšie je použi

ť implementačne nezávislú konštantu

a = a & ~0377;

Programovanie - prednáška

č. 8

22

Logický súčet bitov dvoch slov

Táto operácia vykoná logický súčet jednotlivých bitov na tých istých pozíciách
dvoch slov

slovo

1

| slovo

2

Používa sa často na nastavenie bitov v bitovom segmente

int a, b;

b = b << 4;

a = a & ~0360;

a = a | b;

zápis celočíselnej hodnoty z premennej b do premennej a do bitového
segmentu od 4. po 7. bit (v premennej b predpokladáme hodnotu 0 – 15)

Programovanie - prednáška

č. 8

23

Bitové polia

• Umožňujú štruktúrovaný pohľad na

neštruktúrovaný typ int

• Definujú (deklarujú) sa ako jedna zložka

štruktúry záznam

• Umožňujú odkazovať sa na zložky, veľkosť

ktorých je špecifikovaná v bitoch

• Vhodné ak chceme považovať údajový objekt za

súbor bitov (napr. kvôli šetreniu pamäťového
miesta, pri komunikácii s V/V zariadeniami, atď.)

Programovanie - prednáška

č. 8

24

Definícia bitového poľa

Definícia bitového poľa je v jazyku C realizovaná pomocou štruktúry

struct [názov] {

unsigned [zložka

1]

: velkos

ť

1;

unsigned [zložka

2]

: velkos

ť

2;

...

unsigned [zložka

n]

: velkos

ť

n;

} [zoznam

_premenných];

Hodnota velkosť

i nesmie presiahnú

ť veľkosť typu unsigned int

Ak je velkosť

i rovná 0, potom

ďalšia zložka bitového poľa bude začínať na

novom slove unsigned int

Ak je vynechaný identifikátor zložka

i, potom bude

ďalšie bitové pole

posunuté o veľkosť uvedenú za :

Programovanie - prednáška

č. 8

25

Operácia s bitovým poľom

• S bitovým poľom sú dovolené všetky

operácie ako s typom int, okrem operátora
výpočtu adresy &

• V bitovom poli nie je dovolené použiť ako

prvok pole

• Bitové polia sú implementačne závislé

Programovanie - prednáška

č. 8

26

Príklady použitia bitového poľa

Príklad použitia bitových polí ako komunika

čného rozhrania nejakého zariadenia

struct device_interface {

unsigned R_W : 1;

// bitové pole o ve

ľkosti 1 bit

unsigned : 0;

// prechod na nové slovo

unsigned Dir1 : 1;

unsigned Dir2 : 1;

unsigned Dir3 : 1;

unsigned : 4;

// 4 bity budú nevyužité

unsigned Mode : 3;

} device;

// definícia premennej pozostávajúcej z bitových polí

Bitové polia pre prácu v pohyblivej rádovej

čiarke (predpokladáme int aj float na

32 bitov) a union s variantami použitia reálneho

čísla

struct PHRC {

unsigned znamienko_mantisy : 1;

unsigned exponent : 8;

unsigned mantisa : 23;

};

union {

float x;

struct PHRC y;

} realne_cislo;

Automaticky vygenerovaný textový náhľad. Pre plné formátovanie si stiahnite súbor.