Thread View: de.comp.lang.c++
6 messages
6 total messages
Started by Dmitrij Sverdlov
Mon, 08 Apr 1996 20:50
Operatorenueberladung bei Bitfelder
Author: Dmitrij Sverdlov
Date: Mon, 08 Apr 1996 20:50
Date: Mon, 08 Apr 1996 20:50
41 lines
1295 bytes
1295 bytes
Ich schreibe gerade eine Klasse für Bitfelder und komme nicht weiter.
Bisher habe ich folgendes geschafft:
class bitfield
{
char *bitarray; // Zeiger auf das Bitfeld
public:
bitfield (unsigned bits);
~bitfield();
char operator[] (unsigned bitNr);
};
bitfield::bitfield (unsigned bits)
{
bitarray = new char [ bits / 8 + (bits%8 ? 1: 0) ]; // Soviel Bytes
// reservieren, wie für das Bitarray nötig
}
bitfield::~bitfield()
{
delete bitarray;
}
char bitfield::operator[] (unsigned bitNr)
{
return ( bitarray [bitNr/8] ) & ( 1 << bitNr%8 ) ;
}
Mit der Überladung von [] habe ich nun Ausdrücke der Form
bitfield Bitfield(100);
...
if ( Bitfield[45] ) { ... }
...
ermöglicht, also das Lesen der Bits. Wie kann ich aber die Bits
schreiben, also z.B. Bitfield[67] = 1; ?
Hilft bitte einem Anfänger,
Re: Operatorenueberladung bei Bitfelder
Author: Dietmar Kuehl
Date: Tue, 09 Apr 1996 11:20
Date: Tue, 09 Apr 1996 11:20
53 lines
2165 bytes
2165 bytes
Hi,
Dmitrij Sverdlov (sverdlov@informatik.hu-berlin.de) wrote:
: Ich schreibe gerade eine Klasse für Bitfelder und komme nicht weiter.
: Bisher habe ich folgendes geschafft:
[groesstenteils geloescht]
: char bitfield::operator[] (unsigned bitNr)
: {
: return ( bitarray [bitNr/8] ) & ( 1 << bitNr%8 ) ;
: }
: Mit der Überladung von [] habe ich nun Ausdrücke der Form
: bitfield Bitfield(100);
: ...
: if ( Bitfield[45] ) { ... }
: ...
: ermöglicht, also das Lesen der Bits. Wie kann ich aber die Bits
: schreiben, also z.B. Bitfield[67] = 1; ?
Mach es doch einfach so, wie es bei der Standard-Klasse 'bitset'
gemacht wird: Ueber eine Proxy-Klasse, die eine Referenz auf ein Bit
darstellt ('bitset' ist zugegebenermassen relativ unbekannt; in
Plauger's Buch wird sie als 'bits' dokumentiert):
template <size_t N> class bitset
{
//...
public:
class reference
{
friend class bitset<N>;
//...
public:
reference const &operator= (reference const &newVal);
reference const &operator= (bool newVal);
operator bool() const;
};
reference operator[] (unsigned int bitIdx);
bool operator[] (unsigned int bitIdx) const;
};
Die Implementation der relevanten Funktionen ist relativ einfach: Die
'reference' wird mit einer Referenz auf den entsprechenden 'char' und
der Bitnummer (oder der entsprechenden Maske) konstruiert. Die
Operatoren von 'reference' lassen sich dann einfach implementieren.
--
dietmar.kuehl@uni-konstanz.de
http://www.informatik.uni-konstanz.de/~kuehl/
I am a realistic optimist - that's why I appear to be slightly pessimistic
Re: Operatorenueberladung bei Bitfelder
Author: Ralf W. Stephan
Date: Tue, 09 Apr 1996 15:37
Date: Tue, 09 Apr 1996 15:37
20 lines
981 bytes
981 bytes
Dmitrij Sverdlov writes: > delete bitarray; Das muß delete [] bitarray; heißen > char bitfield::operator[] (unsigned bitNr) Hier solltest Du besser ein bool zurückgeben. > ermöglicht, also das Lesen der Bits. Wie kann ich aber die Bits > schreiben, also z.B. Bitfield[67] = 1; ? Aaah, das ist ein Problem, da es ja in C++ und damit Deiner (zugegeben platzsparenden) Implementation keinen Pointer auf ein Bit geben kann. Fällt mir jetzt spontan nix dazu ein außer für jedes Bit ein char zu verwenden oder mal in die libg++ reinzuschauen, da gibt es mehrere Klassen für. ralf
Re: Operatorenueberladung bei Bitfelder
Author: Ullrich von Bassewitz
Date: Tue, 09 Apr 1996 18:18
Date: Tue, 09 Apr 1996 18:18
15 lines
1014 bytes
1014 bytes
Dmitrij Sverdlov (sverdlov@informatik.hu-berlin.de) wrote:
> ermöglicht, also das Lesen der Bits. Wie kann ich aber die Bits
> schreiben, also z.B. Bitfield[67] = 1; ?
Der uebliche Weg ist, eine Referenz zurueckzuliefern. Das funktioniert aber
hier aus offensichtlichen Gruenden nicht. Was Du statt dessen machen kannst
ist das Ueberladen der Operatoren "+" und "+=".
Gruss
Uz
--
Ullrich von Bassewitz uz@ibb.schwaben.com
Re: Operatorenueberladung bei Bitfelder
Author: Walter Doerwald
Date: Tue, 09 Apr 1996 23:35
Date: Tue, 09 Apr 1996 23:35
33 lines
1629 bytes
1629 bytes
Ralf W. Stephan schrieb in <1996Apr9.153753.1392@ark.franken.de> folgendes: > Dmitrij Sverdlov writes: > > delete bitarray; > > Das muß delete [] bitarray; heißen > > > char bitfield::operator[] (unsigned bitNr) > > Hier solltest Du besser ein bool zurückgeben. > > > ermöglicht, also das Lesen der Bits. Wie kann ich aber die Bits > > schreiben, also z.B. Bitfield[67] = 1; ? > > Aaah, das ist ein Problem, da es ja in C++ und damit Deiner (zugegeben > platzsparenden) Implementation keinen Pointer auf ein Bit geben kann. > Fällt mir jetzt spontan nix dazu ein außer für jedes Bit ein char zu > verwenden oder mal in die libg++ reinzuschauen, da gibt es mehrere > Klassen für. > > > ralf Eine andere Möglichkeit wäre, daß der operator[] ein Objekt zurückgibt, das sich merkt welches Bit angesprochen wurde und das einen Zuweisungsoperator besitzt. Stellt sich nur die Frage, ob man für eine "natürlichere" Syntax sowas auf sich nehmen will. (Was ist z.B. mit der Lebensdauer von Array bzw. Hilfsobjekt etc.?) Bis demnächst... Walter Dörwald
Re: Operatorenueberladung bei Bitfelder
Author: Dietmar Kuehl
Date: Wed, 10 Apr 1996 14:06
Date: Wed, 10 Apr 1996 14:06
26 lines
1811 bytes
1811 bytes
Hi, Walter Doerwald (walter@data.franken.de) wrote: : Eine andere Möglichkeit wäre, daß der operator[] ein Objekt zurückgibt, das : sich merkt welches Bit angesprochen wurde und das einen Zuweisungsoperator : besitzt. Siehe meinen vorherigen Artikel in diesem Thread bzw. direkt die Definition der Klasse 'bitset' im DWP. : Stellt sich nur die Frage, ob man für eine "natürlichere" Syntax sowas auf : sich nehmen will. (Was ist z.B. mit der Lebensdauer von Array bzw. : Hilfsobjekt etc.?) Nun, es gibt eigentlich keine Probleme: Es ist leicht zu implementieren und es kostet auch nicht so furchtbar viel Laufzeit. Indem man die Konstruktoren der entsprechenden Klasse alle 'private' macht (und die Bit-Klasse zu einem Freund), laesst sich auch das Problem mit der Lebensdauer [fast] vollstaendig beseitigen: Die einzige Moeglichkeit, dass ein Hilfobjekt ein Objekt in einem zerstoerten Array referenziert ist, eine Referenz auf das Hilfsobjekt, das von 'operator[]()' zurueckgeliefert wird, zu nehmen und dann das Array zu zerstoeren. Ein etwas merkwuerdiges Vorgehen... -- dietmar.kuehl@uni-konstanz.de http://www.informatik.uni-konstanz.de/~kuehl/ I am a realistic optimist - that's why I appear to be slightly pessimistic
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads