bitfelder ansprechen

will2k

Mitglied
Hallo,

der Benutzer kann eine Lagerplatznummer reservieren auf einem LKW-Anhänger. Jeder Anhänger hat 128 Lagerplätze zur Verfügung von 1 - 128. Ist ein Lagerplatz belegt = 1 , frei = 0

Nun frage ich mich, ob ich

1. ein Array mit 128 int werten reservieren soll z.B.
C++:
int iArrayLagerplatz[128]

oder

2. ein Array mit 4 int Werten
C++:
int iArrayLagerplatz[4]

Ersteres wäre zwar geschickt da die Lagerplatznummer dem Index des Arrays entspräche doch dann müsste ich auch alle 32 bits von der einer Array variablen setzen, testen, löschen -> Ressourcenverschwendung.

Letzeres birgt das Problem dass ich nicht weiß, wenn der Benutzer z.B. Lagerplatz 73 eingibt, wie ich genau das Bit an an der Position 73 auf 1 setze , denn die Zahl 73 ist binär dargestellt nicht:

Code:
Array index [0]: 00000000 00000000 00000000 00000000 = 32 bit
Array index [1]: 00000000 00000000 00000000 00000000 = 32 bit kumuliert: 64 bit
Array index [2]: 00000000 10000000 00000000 00000000 = 32 bit wobei das 73 bit gesetzt ist.

Wie kann ich also genau das Bit 73 setzen sodass die restlichen bits unangetastet bleiben, denn die dezimahlzahl 73 ist binär ja

*rechne nach* 01001001 (64+8+1) doch 01001001 entspricht halt nicht obigem bit 73... :confused:
 
Hi.

ich würde ein 16 elementiges unsigned char-Array verwenden (da ein char immer 8 Bit groß sein muss - ein int ist nicht immer 32 Bit groß):
C:
unsigned char lager[16]; // Bits von 0 bis 127 = 128 Plätze

// Bit 73 setzen:
lager[73 / 8] |= 1 << (73 % 8);
Gruß
 
Hi.

ich würde ein 16 elementiges unsigned char-Array verwenden (da ein char immer 8 Bit groß sein muss - ein int ist nicht immer 32 Bit groß):
C:
unsigned char lager[16]; // Bits von 0 bis 127 = 128 Plätze

// Bit 73 setzen:
lager[73 / 8] |= 1 << (73 % 8);
Gruß

das schenkt sich aber nix... unsigned int myArray[4]; 0 bis 127 auch = 128 Plätze zudem benötige ich nur 4 Abfragen

if (usereingabe < 33 && usereingabe > 0) spreche Array[0] an , da usereingabe zwischen 1-32 sein muss, eingabe 0 ist nicht erlaubt.
if(usereingabe > 32 && usereingabe < 65) spreche Array[1] an, usw...

bei deinem beispiel müsste ich ja 16 Fälle unterscheiden, daher gefällt mir das nicht.
 
das schenkt sich aber nix... unsigned int myArray[4]; 0 bis 127 auch = 128 Plätze
Wie ich bereits sagte, ist ein int nicht immer 32 Bit groß, so dass ein 4 elementiges int Array nur 64 Bits beinhalten könnte...
if (usereingabe < 33 && usereingabe > 0) spreche Array[0] an , da usereingabe zwischen 1-32 sein muss, eingabe 0 ist nicht erlaubt.
if(usereingabe > 32 && usereingabe < 65) spreche Array[1] an, usw...

bei deinem beispiel müsste ich ja 16 Fälle unterscheiden, daher gefällt mir das nicht.
Wie ich bereits demonstriert habe, benötige ich gar keine Abfragen.

Gruß
 
Zuletzt bearbeitet:
Wie ich bereits sagte, ist ein int nicht immer 32 Bit groß, so dass ein 4 elementiges int Array nur 64 Bits beinhalten könnte...

Wie ich bereits demonstriert habe, benötige ich gar keine Abfragen.

Gruß

also auf meinem 32 Bit system ist der int immer 32 Bit groß und auf einem anderen system läuft meine routine auch nicht ;-)

Aber wegen den Abfragen haste recht, habe deine Zeile:

Code:
lager[73 / 8] |= 1 << (73 % 8);
total übersehen...

ok 73 ist die eingegebene Zahl / 8 weil ein Byte 8 Bit hat doch hier kommt 9 rest 1 raus ich kann einem Array doch nur einen int als index geben? und was heißt |= 1 << (73 % 8) sorry ich habe das noch nirgends gesehen, kannst du das erläutern, DANKE! :)
 
ok 73 ist die eingegebene Zahl / 8 weil ein Byte 8 Bit hat doch hier kommt 9 rest 1 raus ich kann einem Array doch nur einen int als index geben?
Ein Operator in C hat immer nur 1 Resultat. Bei der Integerdivision kommt 9 raus. Der Rest muss mit dem Modulo Operator (%) berechnet werden.
und was heißt |= 1 << (73 % 8) sorry ich habe das noch nirgends gesehen, kannst du das erläutern, DANKE! :)
Hast du denn kein C Buch? Dann such mal in Internet nach den Bitoperatoren in C. Der Zuweisungsoperator |= ist nur eine Abkürzung:
C:
a |= 2;

// ist das gleiche wie:

a = a | 2;
Gruß
 
Zurück