Bit-Problem
-
Hi Leute!
Ich hab hier einen etwas längeren Code. Ich möchte in der Funktion getSlice() ein Teilwort extrahieren. Leider steh ich da grad etwas auf'm Schlauch. Könnt ihr mir helfen?
#include<iostream> using namespace std; struct bitvector { unsigned char *bits; //deklaration der Membervariable }; char *printBitVector(struct bitvector *bv, unsigned int anzahl) { int j = 0; char str_ausgabe[1000]; for(int i=anzahl-1; i>=0; i=i-1) { if((bool(bv->bits[i/8] & (1 << i%8))) == true) { str_ausgabe[j] = '1'; } else { str_ausgabe[j] = '0'; } j = j + 1; //cout << bool(bv->bits[i/8] & (1 << i%8)); //gibt die Bits mit Datentyp bool aus } str_ausgabe[j] = '\0'; cout << str_ausgabe << endl << endl; return str_ausgabe; } struct bitvector *createBitVector(struct bitvector *bv, unsigned int anzahl) { int var; if(anzahl%8 != 0) { var = (anzahl / 8) + 1; } else { var = anzahl / 8; } bv->bits = new unsigned char[var]; for(int i=0; i<var; i=i+1) //Array wird standardmäßig auf 0 gesetzt! { bv->bits[i] = 0; } return bv; } void setBit(struct bitvector *bv, unsigned int anzahl, unsigned int stelle) { cout << "!!!setBit!!!" << endl; cout << "Stelle eingeben: "; cin >> stelle; stelle = stelle - 1; //"richtige" Stellenangabe wieder in einen Index konvertieren //Bit setzen an die Stelle von 'stelle' bv->bits[stelle/8] = bv->bits[stelle/8] | (1 << stelle%8); //(1 << 5) erste Zahl darf nur '1' sein //zweite Zahl gibt die zu schreibende Stelle an //!VORSICHT! die Wertigkeit bei Binärzahlen beginnt bei 0 } void resetBit(struct bitvector *bv, unsigned int anzahl, unsigned int stelle) { cout << "!!!resetBit!!!" << endl; cout << "Stelle eingeben: "; cin >> stelle; stelle = stelle - 1; //"richtige" Stellenangabe wieder in einen Index konvertieren bv->bits[stelle/8] = bv->bits[stelle/8] & ~(1 << stelle%8); } unsigned int getBit(struct bitvector *bv, unsigned int pos) { return (bv->bits[pos/8] >> ((pos%8) & 1)); } struct bitvector *getSlice(struct bitvector *bv, unsigned int anzahl, unsigned int pos, unsigned int n) { bitvector maske; int i; createBitVector(&maske, anzahl); printBitVector(bv, anzahl); pos = pos + 1; //(pos+1) ist die konvertierung zurück von Index nach "richtiger" Stelle getBit(bv, pos); cout << "verschoben: "; printBitVector(bv, anzahl); cout << "extrahierte Bits: "; printBitVector(&maske, n); return bv; } int main() { bitvector bv; //Variable für struct bitvector bitvector maske; unsigned int anzahl = 0, stelle = 0, pos = 0, n = 0; cout << "Bitanzahl der Bit-Kette eingeben: "; cin >> anzahl; cout << endl; createBitVector(&bv, anzahl); //hier kann nur Adresse übergeben werden, deswegen Adressoperator (&) printBitVector(&bv, anzahl); for(int i=0; i<3; i=i+1) //nur für Testzwecke { setBit(&bv, anzahl, stelle); printBitVector(&bv, anzahl); } resetBit(&bv, anzahl, stelle); printBitVector(&bv, anzahl); cout << "Position der zu extrahierenden Bits eingeben: "; cin >> pos; pos = pos - 1; //"richtige" Stellenangabe wieder in den Index zur Adressierung konvertieren cout << endl; cout << "Anzahl der zu extrahierenden Bits eingeben: "; cin >> n; cout << endl; getSlice(&bv, anzahl, pos, n); printBitVector(&bv, anzahl); delete[](bv.bits); return 0; }
-
Störend C-lastiger C++-Code. Altes Buch.
Muß so ein slice wirklich eine Kopie der Ausgangsdaten bereitstellen, oder reicht es, eine Ansicht zu sein?
-
Ich denke mal es reicht, wenn das extrahierte Teilwort in dem von mir "maske" genannten BitVector steht. Es muss keine Kopie angelegt werden. Das mit dem schlechten C++-Code kann ich leider nicht ändern, da wir das momentan so machen sollen.
Wie soll ich denn nun weiter vorgehen?
Das getBit soll übrigens die einzelnen Bits holen. Aber irgendwie funktioniert das alles nicht so wirklich!
-
Ich hab übrigens noch ein Problem welches ich nicht zu Lösen vermag.
Wenn ich z.B. bei getBit()
return (bv->bits[pos/8] >> ((pos%8) & 1));schreibe, dann adressiere ich ja mit "pos/8" das array. Da mein LSB im Array aber an der rechten Stelle steht, adressiere ich quasi mit pos/8 das falsche Element des Arrays. Ich weiß nicht wie ich da eben dann das zweite Element adressieren könnte...
0000001011000000 | | MSB LSB
-
BTW: mit C++/CLI hat das überhaupt nichts zu tun
Völlig falsches Forum!
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ (auch C++0x) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.