Bitweises speichern/lesen [Aufgabe 5d) und die Dateizugriffsrechte]

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Bitweises speichern/lesen [Aufgabe 5d) und die Dateizugriffsrechte]
Weil es in der Vorlesung nicht kam und auch in der Tafelübung nicht mit auf dem Foliensatz ist, vielleicht mal ne kurze Einführung zum Thema bitweises speichern/auswerten (genau das braucht man ja beim Auslesen der Dateizugriffsrechte) und dem damit verbundenen Konzept.
Ist im Prinzip echt wichtig, aber wenn man es nicht einmal gehört/gesehen und gemacht hat, dann kommt man auch nicht von selbst darauf. Aber “Flags” laufen einem doch immer wieder über den Weg und sind eben ein wichtiges Konzept um Informationen bitweise abzuspeichern.

Das Problem: Direkt lassen sich nur einzelne Bytes ansprechen. Hat man jetzt aber eine Serie von 8 boolschen Werten (ja/nein, an/aus, gesetzt/nicht gesetzt …), denn wäre es unnötige Speicherverschwendung dazu 8 Bytes zu verwenden. Eigentlich reicht doch ein Byte, wobei jedes einzelne der 8 Bit einen boolschen Wert repräsentiert. Man braucht also Zugriff auf einzelne Bits. Genau das muss man bei Aufgabe d) und dem Auswerten der Dateizugriffsrechte (die bitweise abgespeichert sind) auch tun.
Die Idee: “Flags” und bitweise und (&) und oder (|) Verknüpfung. (nicht zu verwechseln mit && und || !)
[m]
&: Sind beide Bits gleich “1”, dann 1. Sonst “0”
0101 0110
& 0100 0011
0100 0010
|: Ist mind. ein Bit gleich “1”, dann “1”. Sonst “0”
0101 0110
| 0100 0011
0101 0111
[/m]

Einfaches Beispiel:
Ich hab 8 verschiedene Personen, die auf eine Datei zugreifen können, und möchte mir in einer ein Byte großen Variable “rights” codieren, ob sie die Datei nur lesen (Codierung mit 0) oder auch verändern (Codierung mit 1) dürfen. Dabei soll das erste Bit für Person Nummer 1 stehen usw.
Meine Variable “rights” hat nun den Wert 154.
Die Frage ist jetzt also: welche Person hat den jetzt auch das Recht die Datei zu verändern und wer darf nur lesen?
Dazu definiert man sich die berühmten Flags (in Klammer gleich mal dazu die entsprechende Binärdarstellung der Zahl)

#define PERSON_1 1     (0000 0001) 
#define PERSON_2 2     (0000 0010)
#define PERSON_3 4     (0000 0100)
...
#define PERSON_8 128   (1000 0000)

Möchte man jetzt wissen, ob Person 3 das Recht hat die Datei auch zu verändern, dann lässt sich das mit einer &-Verknüpfung abfragen:

if(rights & PERSON_3) { [...] }

Warum und wie funktioniert das?
Dazu muss man sich die Binärdarstellung von “rights” (in unserem Beispiel mit dem Wert 154) und die anschließende &-Verknüpfung anschauen:
[m]
rights 1001 1010
PERSON_3 & 0000 0100
0000 0000 >> if(0) > “0” wird zu false ausgewertet (3 hat also nur lese-Zugriff)

rights 1001 1010
PERSON_5 & 0001 0000
0001 0000 >> if(16) > “16” wird zu true (5 hat also auch schreib-Zugriff)
[/m]

Das Abfragen der Dateizugriffsrechte für Aufgabe d) funktioniert analog. Die entsprechenden Flags lassen sich in der Manpage finden.

Ich hoff das hilft jetzt auch irgendjemandem weiter :wink:

Für die Aufgabe nicht relevant aber ergänzend der Vollständigkeit halber vielleicht noch das Setzen einzelner Bits.
Eine “1” wird gesetzt mit | und Flag. Eine “0” wird gesetzt mit & und invertiertem Flag:
[m]
1000 0110 1000 0110
| 0001 0000 & 1111 1101
1001 0110 1000 0100
[/m]

Schön
Also ich kenne das Prinzip der Flags zwar schon, aber dennoch hast du das hier sehr schön erklärt.
Wird für viele bestimmt sehr hilfreich sein.


ja. sehr gut verständlich :wink: vielen dank


Noch ein Tipp: Wenn man mal ein bestimmtes Bit haben will, dann kriegt man das mit:1 << (zahl) wobei die zahl die stelle des bits angibt, 1 ist das erste bit usw. Damit muss man sich nicht alle 2er Potenzen merken wenn man mal die 32bits eines ints für flags nutzen will.


zahl == 1 ist das zweite Bit. Die 1 wird um eine Stelle nach links verschoben.

 0000 0001 == 1
 0000 0010 == 1  <<  1 == 2 

ach damn :confused:


aber Informatiker fangen doch bei 0 an zu zaehlen :smiley:


ja du hasst recht die verwirren mich hier mit dem zeug :smiley: