Wie ändert man ein Byte auf Bit Ebene in C++?
-
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?
-
Konrad Rudolph schrieb:
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?
-
SryFalschZitiert schrieb:
Konrad Rudolph schrieb:
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?
Das steht hier nicht zur Debatte, es wurde keine solche Behauptung aufgestellt. Aber wer sowas abschätziges wie „lol da benutzt man referenzen statt zeiger
“ schreibt, der sollte das lieber gut begründen können, oder sich ganz schnell in einem Erdloch verstecken.
-
Zeiger sind einfach veraltet
-
dafür kann dir eine methode wenigstens keinen pointer unterm arsch wegreissen, wie das bei referenzen durchaus der fall sein kann.
-
lol da benutzt man referenzen statt zeiger
Zeiger sind einfach veraltet
C ist ein Bestandteil von C++. Daher ist hier vermutlich nichts veraltet. Referenzen sind ein anderes Sprachmittel für die gleiche Aufgabe. Also locker bleiben. Man kann dies mit C++-Referenzen lösen. Ich habe Funktionen angegeben, die auch mit C funktionieren, z.B. bei Mikroprozessoren, da man dies gerade dort benötigt.
und was spricht dagegen das mittels std::bitset zu lösen, außer das man weniger code schreiben muss?
Nichts, außer der Fast-Unleserlichkeit des Codes und der Tatsache, dass es auch im C-Umfeld funktionieren sollte.
-
pro pointer schrieb:
dafür kann dir eine methode wenigstens keinen pointer unterm ***** wegreissen, wie das bei referenzen durchaus der fall sein kann.
-
Stört euch nicht an dem Thema Referenzen und Zeiger. Referenzen sind in C++ vereinfachte Zeiger, die vom Compiler versteckt gehandhabt werden.
Ein Zeiger an sich verhält sich ähnlich wie eine Referenz, allerdings mit 2 wesentlichen Unterschieden
1. ein Zeiger kann ungültig sein. Eine Referenz ist immer an einen Wert gebunden. Zeiger sind das nicht. Zeiger können undefiniert sein, zB int* p; - hier zeigt p irgendwo hin. Wenn wir ihn jetzt ansprechen *p=3; erzeugen wir undefiniertes Verhalten (also meistens einen Absturz. Es gibt auch NULL Zeiger, diese zeigen auf 0 und somit als ungültig gekennzeichnet. int* p=0;.
2. ein Zeiger kann 'wandern'. Mann kann einen Zeiger ganz oft auf verschiedene Sachen zeigen lassen. zB wenn man 10 int Variablen hintereinander hat (Array), kann man ganz einfach in einer Schleife mit einem Zeiger alle 10 int Variablen ansprechen.
-
Hello,
pointers can you in my opinion completely forget.