Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />
15 Bitfelder<br />
Bei Strukturen kann für <strong>in</strong>t Member angegeben werden, wieviele Bit's sie belegen sollen. (Aber<br />
pro Feld nicht mehr als es Bits <strong>in</strong> e<strong>in</strong>em <strong>in</strong>t hat). Die Bits werden fortlaufend von e<strong>in</strong>em <strong>in</strong>t vergeben,<br />
<strong>und</strong> sobald es für e<strong>in</strong> neues Feld ke<strong>in</strong>en Platz im angebrochenen <strong>in</strong>t mehr hat, wird das ganze<br />
Feld <strong>in</strong> e<strong>in</strong>em neuen <strong>in</strong>t abgelegt <strong>und</strong> von <strong>die</strong>sem <strong>in</strong>t mit der Bitzuteilung weitergefahren. Bitfelder<br />
können nicht über <strong>in</strong>t-Grenzen h<strong>in</strong>weggehen.<br />
Mit Bitfeldern kann Speicherplatz gespart werden, oder es können Register von Peripheriebauste<strong>in</strong>en<br />
abgebildet werden. Achtung, bei Bitfeldern ist fast alles herstellerabhängig, Programme <strong>die</strong><br />
von der tatsächlichen Bitposition im Speicher abhängen, s<strong>in</strong>d mit Sicherheit nicht portabel!<br />
struct Date {<br />
<strong>in</strong>t Day : 5; /* Fuer den Tag brauchen wir nur 5 Bit (0...31) */<br />
<strong>in</strong>t Month : 4; /* Fuer den Monat reichen 4 Bit (0...15) */<br />
<strong>in</strong>t Year : 7; /* Fuer 2 stellige Jahrzahlen genuegen 7 Bit (0...128) */<br />
} Heute;<br />
Heute.Day = 24;<br />
Heute.Month = 12;<br />
Heute.Year = 99;<br />
Diese Struktur Date für Daten braucht somit nur 16 Bit oder 2 Bytes Speicherplatz.<br />
Auch Flags (E<strong>in</strong>zelne Bits) können so Platzsparend abgelegt werden:<br />
struct FileInfo {<br />
<strong>in</strong>t Readonly : 1;<br />
<strong>in</strong>t Hidden : 1;<br />
<strong>in</strong>t System : 1;<br />
<strong>in</strong>t Archived : 1;<br />
<strong>in</strong>t L<strong>in</strong>k : 1;<br />
};<br />
Diese Flags benötigen nur 5 Bits, können also problemlos <strong>in</strong> e<strong>in</strong>em Byte abgelegt werden.<br />
Man muss sich aber im klaren se<strong>in</strong>, dass man so zwar Speicherplatz spart, aber der Rechenaufwand<br />
grösser wird. Schliesslich muss der Compiler auf <strong>die</strong> e<strong>in</strong>zelnen Bits mit Schieben, And- <strong>und</strong> Or-<br />
Verknüpfungen zugreifen.<br />
Beispiel Datestruktur:<br />
Year (7 Bit) Month (4) Day (5 Bit)<br />
15 9 8 5 4 0<br />
/* Die Anweisung */<br />
Heute.Month = a;<br />
/* wird vom Compiler übersetzt zu */<br />
Heute = (Heute & 0xFE1F) | ((a & 0x000F) > 5) & 0x000f;<br />
/* Und falls das Vorzeichen erhalten bleiben soll, zu */<br />
b = (Heute > 11;<br />
Gedruckt am 10.09.2009 14:23:00 Letzte Änderung am: 10. September 2009 Version 2.4.1, I. Oesch 55/147