PDF

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

Formát
PDF
Veľkosť
71 kB
Pridané
Stiahnutí
1 158
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.