Binaere Darstellung einer Zahl
-
Ich will eine float Variable als eine Reihe von 0 und 1 darstellen. Deshalb wird ein char Zeiger benutzt. Trotzdem weiß ich nicht wie es weiter gehen muss.
float p= 3.14; char *pf= reinterpret_cast<char*>(&p);Die einzelnen Bits sollen in einem vector<bool> gespeichert werden.
-
Da stellt sich doch als erstes die Frage: welche Darstellung soll gewählt werden?
Ehrlich gesagt weiß ich nicht wie ein aktueller Computer eine Kommazahl speichert, aber ich habe in meinem ersten Semester mehrere Methoden kennengelernt wie das zu bewerkstelligen ist.
Eine für Festkommadarstellung, und ein paar für Gleitkommadarstellung.
Glaube der IEEE Standard mit der benötigten Genauigkeit wird genutzt (float = 32bit). Da hast du dann ein Bit fürs Vorzeichen, 8 für den Exponent und 23 für die Mantisse...
-
template<class Inserter, class Type> void push_binary(Type const& value, Inserter insert) { for(int byte = 0; byte < sizeof(Type); ++byte) { for(int bit = 0; bit < 8; ++bit) { insert = (reinterpret_cast<unsigned char*>(&value)[byte] & (1 << bit)) > 0 ? 1 : 0; } } } vector<bool> vec; push_back(3.14f, back_insterter<vector<bool> >(vec));Alles ungetestet.
-
Warn paar Fehler drin, Schande über mich, aber habs schnell getestet da ich hier (Arbeit) eh nix zu tun habe und ich noch nicht gehen kann (will ja Lohn).
#include <iostream> #include <vector> #include <iterator> #include <algorithm> template<class Inserter, class Type> void push_binary(Type const& value, Inserter insert) { for(int byte = 0; byte < sizeof(Type); ++byte) { for(int bit = 0; bit < 8; ++bit) { insert = (reinterpret_cast<const unsigned char*>(&value)[byte] & (1 << bit)) > 0 ? 1 : 0; } } } int main() { using namespace std; vector<bool> vec; vec.reserve(sizeof(float) * 8); push_binary(3.14f, back_inserter<vector<bool> >(vec)); copy(vec.begin(), vec.end(), ostream_iterator<bool>(cout, "\n")); return 0; }
-
Fachman für Fragen, danke sehr. Die Darstellung der Zahlen sollte eigentlich 1:1 sein - d.h. wir haben 3.14 als float Variable -> diese Variable besteht aus mehreren Bytes -> die Bytes werden in Bits zerlegt -> die Bits werden gespeichert. Wie Sie sehen, spielt die Darstellung in diesem Fall keine große Rolle. Und den Vorschlag mit STL finde ich einfach toll - jetzt kann ich sogar eigene Objekte in Bits verwandeln

-
Könnten Sie mir jetzt bei der Umkehrimplementation helfen. Wir haben die Bits in einem sequentiellen Feld, und wir brauchen das Objekt!
-
Am Rande möchte ich ein kleines Metaprogramm vorstellen, das Zahlen im Binärformat zu Zeiten des Kompilierens ins Dezimalformat umwandelt. Als mögliche Lösung zu einer der Aufgaben (3-0) aus "C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond' von D. Abrahams und A. Gurtovoy habe ich es wie folgt geschrieben. Eine sehr ähnliche Möglichkeit findet sich auf dem Zugehlörigen Wiki unter
http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?CPPTM_Answers_-_Exercise_3-0
Die Überprüfung mit dem BOOST_STATIC_ASSERT habe ich dort heraus übernommen.
#include <cstdlib> #include <iostream> #include <boost/static_assert.hpp> using namespace std; template <unsigned int n> struct binary { static const unsigned int d = n % 10; BOOST_STATIC_ASSERT(d == 0 || d == 1); static const unsigned int value = d + (binary<n/10>::value * 2); }; template <> struct binary<0> { static const unsigned int value = 0; }; int main() { cout << binary<11001>::value << endl; cout << binary<110111>::value << endl; cout << binary<1111011>::value << endl; /** * Ausgabe: 25 55 123 */ return EXIT_SUCCESS; }
-
Hmm, jetzt denke ich, dass vector<bool> nicht so effektiv ist. Außerdem sind die Daten, die ich umwandle immer ein Vielfach von 8 Bits. Deshalb schlage ich vor, dass anstatt vector<bool> - vector<bitset<8> > zu benutzen.