Wie ändert man ein Byte auf Bit Ebene in C++?
-
Bitoperator schrieb:
Wenn ich z.B. eine Char Variable mit dem Wert 'B' habe (entspricht 0100 0010) und möchte nun das 5. Bit und 6.Bit von rechts gesehen in eine 1 ändern,
so daß 0111 0010 herauskommt, wie mache ich das am besten in C++?Indem du in C++ vorhandene Operatoren geeignet verknüpfst. Dafür kann man dann auch eine Funktion schreiben.
unsigned char flip(unsigned char v, int bit) { return v ^ ( 1 << bit ); }
Gibt's dafür Operatoren um direkt auf ein Bit zugreifen zu können?
Nein, wären auch redundant. C und C++ haben allgemein schon eher zu viele Operatoren.
-
camper schrieb:
C und C++ haben allgemein schon eher zu viele Operatoren.
habs irgendwann mal nachgezählt. C hat 47 operatoren. ist schon 'ne ganze menge.
-
du hast also quasi folgendes gefragt:
ich habe die zahl 835 und möchte nur die 8 haben bzw bearbeiten
aber plus minus mal und geteilt sind verboten...
-
du hast also quasi folgendes gefragt:
ich habe die zahl 835 und möchte nur die 8 haben bzw bearbeiten
aber plus minus mal und geteilt sind verboten...
das geh auch mit bitoperatoren^^
-
std::bitset?
-
er wollte glaub ehr C stil
-
bitset ist nicht langsamer als eine reine c-implementierung, aber deutlich eleganter. es spricht daher wenig gegen diese möglichkeit.
-
Hier ist der typische Stil bei der Mikroprozessor-Programmierung in C:
PORTx |= (1 << BitNummer); //bit setzen PORTx &= ~(1 << BitNummer); //bit löschen ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); //mehrere bits setzen
Ich hoffe, das hilft etwas weiter.
-
Bitoperator schrieb:
...Gibt's dafür Operatoren um direkt auf ein Bit zugreifen zu können?
Soweit ch weiß, nicht ... allerdings hat das nichts mit C++ zu tun, sondern damit, wie ein Rechner seinen Speicher adressiert und dessen Inhalt verändert - und wenn der Rechner das nicht bitweise tut, kann das auch keine Programiersprache der Welt ändern.
Gruß,
Simon2.
-
Simon2 schrieb:
und wenn der Rechner das nicht bitweise tut, kann das auch keine Programiersprache der Welt ändern.
dann ist das aber ein rechner, für den weder C noch C++ compiler existieren. oder nur solche abgespeckten varianten, die keine bitoperatoren haben.
-
Wo ist das Problem?
-
Erhard Henkes schrieb:
Wo ist das Problem?
das ist hier die frage
-
fricky schrieb:
Simon2 schrieb:
und wenn der Rechner das nicht bitweise tut, kann das auch keine Programiersprache der Welt ändern.
dann ist das aber ein rechner, für den weder C noch C++ compiler existieren. oder nur solche abgespeckten varianten, die keine bitoperatoren haben.
Das hast Du falsch verstanden. Es gibt keine Rechner, die bitweise Adressierung erlauben. Zumindest keine, die mir bekannt wären.
-
Es wäre ein leichtes, eine Sprache zu entwerfen, die mit Operatoren Bit-Zugriff erlaubt. Lässt sich sicher auch recht einfach in C++ implementieren, zumindest das Setzen und Löschen eines Bits
-
Lässt sich sicher auch recht einfach in C++ implementieren, zumindest das Setzen und Löschen eines Bits.
Ja, genau.
#include <iostream> using namespace std; void setbit( unsigned short *target, unsigned char bitnumber) //bit setzen { *target |= (1 << bitnumber); } void clearbit( unsigned short *target, unsigned char bitnumber) //bit löschen { *target &= ~ (1 << bitnumber); } int main() { unsigned short zahl = 0; unsigned short bitnumber; cout << "Geben Sie bitte das zu behandelnde Bit ein (0-15): "; cin >> bitnumber; setbit(&zahl, bitnumber); cout << zahl << endl; clearbit(&zahl, bitnumber); cout << zahl << endl; return 0; }
-
lol da benutzt man referenzen statt zeiger
-
und was spricht dagegen das mittels std::bitset zu lösen, außer das man weniger code schreiben muss?
int main() { std::bitset<std::numeric_limits<unsigned long>::digits> bitset_der_zahl; //default ist alles 0 unsigned short bitnumber = 0; cout << "Geben Sie bitte das zu behandelnde Bit ein (0-"<<std::numeric_limits<unsigned long>::digits-1 <<"): "; //um mal portabel zu programmieren ;) cin >> bitnumber; bitset_der_zahl[bitnumber]=1; cout << bitset_der_zahl.to_ulong() << endl; bitset_der_zahl[bitnumber]=0; cout << bitset_der_zahl.to_ulong() << endl; return 0; }
die umwandlung eines bitset von und nach unsigned long ist kostenlos, sobald der compiler ein bisschen optimieren darf, da es sich dabei um die interne repräsentation handelt und alles inline gelöst ist.
-
warning schrieb:
lol da benutzt man referenzen statt zeiger
Da bist Du Dir ja verdammt sicher. – Und warum? Was spricht gegen Zeiger?
-
gibst es jetzt eine flamewar bzgl referenz vs. zeiger?
bevor das los geht: es ist geschmackssache. der streit lohnt nicht...
-
Konrad Rudolph schrieb:
warning schrieb:
lol da benutzt man referenzen statt zeiger
Da bist Du Dir ja verdammt sicher. – Und warum? Was spricht gegen Zeiger?
Warum Zeiger? Ist es sinnvoll NULL zu übergeben?