Wie ändert man ein Byte auf Bit Ebene in C++?
-
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.
-
Erhard Henkes schrieb:
Nichts, außer der Fast-Unleserlichkeit des Codes
wenn du die numeric_limits rausnimmst, sieht er aus meiner sicht deutlich einfacher lesbar aus als deine variante. ich habe die nur reflexartig mit rein gesetzt, da sie quasi keinen aufwand machen, aber hinter viel ärger sparen können.
Erhard Henkes schrieb:
und der Tatsache, dass es auch im C-Umfeld funktionieren sollte.
überlese ich gerade irgendeinen teil der frage? da steht etwas davon, dass er eine c++ lösung haben wollte, nicht das es auch in reinem c funktionieren soll.
-
Gibt schon eine Lösung aber die wird sich denke ich je nach compiler/platform anders verhalten.
#prama pack(on) union bit_byte { struct bits { unsigned bit1 : 1; unsigned bit2 : 1; unsigned bit3 : 1; unsigned bit4 : 1; unsigned bit5 : 1; unsigned bit6 : 1; unsigned bit7 : 1; unsigned bit8 : 1; }; unsigned char byte; }; #pragma pack(off) struct bit_byte test; test.byte = 2; test.bits.bit2 = 0;
-
Na, wer jetzt nichts findet, dem ist nicht mehr zu helfen.
Das zeigt wieder die Vielfalt und Eleganz von C++.
-
Konrad Rudolph schrieb:
Es gibt keine Rechner, die bitweise Adressierung erlauben. Zumindest keine, die mir bekannt wären.
Manche µCs können das. Der interne RAM hat dann z.B. bitweise adressierbare Bereiche, damit man länger ohne langsamen und platz- und stromfressenden externen RAM auskommt.
-
Superlexx schrieb:
Konrad Rudolph schrieb:
Es gibt keine Rechner, die bitweise Adressierung erlauben. Zumindest keine, die mir bekannt wären.
Manche µCs können das. Der interne RAM hat dann z.B. bitweise adressierbare Bereiche, damit man länger ohne langsamen und platz- und stromfressenden externen RAM auskommt.
Aber die Chance, C++ genau auf so einer Architektur zu programmieren, ist halt nicht allzu groß.
Deswegen mein Einwand gegen das dringende Bedürfnis des OPs nach bitweisen Speicheroperationen....
Gruß,
Simon2.
-
Superlexx schrieb:
Manche µCs können das. Der interne RAM hat dann z.B. bitweise adressierbare Bereiche, damit man länger ohne langsamen und platz- und stromfressenden externen RAM auskommt.
einige haben auch bit -set und -clear befehle, die benachbarte bits einer speicherzelle nicht berühren. wichtig z.b. für register, bei denen schreibzugriffe auf bestimmte bits immer eine wirkung haben, egal was vorher dort hin geschrieben wurde.
Simon2 schrieb:
Aber die Chance, C++ genau auf so einer Architektur zu programmieren, ist halt nicht allzu groß.
das geht mit inline-assembler (ist asm nicht ein schlüselwort von c++?) oder intrisic-funktionen.
-
Ah.... sind wir schon beim Spiel "An-den-Haaren-herbei-ziehen-damit-ich irgendwie-doch-Recht-gehtabt-habe" angekommen ?
Da spiele ich nicht mit.
Gruß,
Simon2.