double nach bitset<64>?



  • MaSTaH schrieb:

    C++ kennt keine Bitangaben der Builtins.

    Was hat das mit meiner Aussage zu tun? Kannst du mir einen Standard Built-in Typ nennen, den ich unter einer 32 Bit Plattform für 64 Bit Integer verwenden kann?
    Dass der Standard keine genauen Bitangaben, sondern lediglich das Verhältis der Integertypen zueinander definiert, ist mir schon klar.



  • Aus der stdlib.h

    _CRTIMP char * __cdecl _i64toa(__int64, char *, int);
    

    Damit kannst du dir deinen __int64 zuerst in ne Zeichenkette umwandeln und dann ausgeben 🙂



  • Ein Hoch auf VC6 und seine tolle Unterstützung der STL...

    Nachdem ich Dev-Cpp installiert hatte, ging das mit dem reinterpret_cast nach bitset<64> zusammen mit der cout Ausgabe ohne Probleme und ich hatte genau was ich wollte! 😉

    Wenn man am Ende wirklich wissen will, was der Compiler treibt, dann muß man ihn wohl "ausschalten" und gleich ASM benutzen!
    Hat mal jemand eine Liste alle AMD64 Befehle? :p



  • Toshi schrieb:

    Ein Hoch auf VC6 und seine tolle Unterstützung der STL...

    Nachdem ich Dev-Cpp installiert hatte, ging das mit dem reinterpret_cast nach bitset<64> zusammen mit der cout Ausgabe ohne Probleme und ich hatte genau was ich wollte! 😉

    Wenn man am Ende wirklich wissen will, was der Compiler treibt, dann muß man ihn wohl "ausschalten" und gleich ASM benutzen!
    Hat mal jemand eine Liste alle AMD64 Befehle? :p

    Du kannst dir auf der Seite von AMD die Architektur-Dokumentation ziehen, dort
    sind dann alle noetigen Informationen enthalten, die du benoetigst ;).

    mfg
    v R



  • Toshi schrieb:

    Ein Hoch auf VC6 und seine tolle Unterstützung der STL...

    Nachdem ich Dev-Cpp installiert hatte, ging das mit dem reinterpret_cast nach bitset<64> zusammen mit der cout Ausgabe ohne Probleme und ich hatte genau was ich wollte! 😉

    Das verhalten ist trotzdem undefiniert, hat Hume doch oben begründet. Daß es auf dem Compiler dann geht heißt nicht, daß er besser ist. Nur daß er ein anderes Speicherlayout wählt oder ähnliches und es deswegen zufällig funktioniert.

    MfG Jester



  • Hm...

    Dann mal eine blöde Frage...
    Wie könnte denn ein bitset aussehen, daß es mir Probleme bereiten würde??

    Jeder "normale" Programmierer wird da 64 zusammenhängende Bits im Speicher als Darstellung wählen und die Adresse auf das erste Bit legen.

    Zusatzinformationen sind nicht nötig, weil C / C++ sowieso keine Bereichsprüfung verlangt...

    Und wo wir gerade dabei sind.
    Was würde sich denn sonst als sinnvolle "festgelegte" Alternative für mich anbieten?
    Long long gibt es ja nach obigen Aussagen in C++ nicht...

    Bleibt mir noch ein eigener Struct, in den ich zwei "normale" longs reinpacke und es dann eben selbst mache...
    Nur kann ich dann nicht so bequem auf einzelne Bits zugreifen und es als einen Block xor-en...



  • Toshi schrieb:

    Ein Hoch auf VC6 und seine tolle Unterstützung der STL...

    Selbst Schuld. Der Compiler ist ja mittlerweile auch über 6 Jahre alt und stammt noch aus einer Zeit, als der aktuelle Standard gerade erst verabschiedet wurde. Warum nimmst du keinen aktuellen MSC, den gibts auch kostenlos.

    Toshi schrieb:

    Und wo wir gerade dabei sind.
    Was würde sich denn sonst als sinnvolle "festgelegte" Alternative für mich anbieten?
    Long long gibt es ja nach obigen Aussagen in C++ nicht...

    Jeder (?) aktuelle Compiler hat zumindest einen Datentyp für 64 Bit. Du könntest dir damit einen eigenen Typ basteln.

    #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901
        typedef long long my_int64;
    #elif defined(_MSC_VER)
        typedef __int64 my_int64;
    #elif defined(__GNUC__)
        // ...
    #else
        #error Besorg dir 'nen ordentlichen Compiler!
    #endif
    


  • [quote="Toshi"]
    Wie könnte denn ein bitset aussehen, daß es mir Probleme bereiten würde??

    template <int size>
    class bitset<size>
    {
      char infosDieIchSoBraucheUmDasZuImplementieren
      char[size/8+1] bits;
    };
    

    schon paßt es nicht mehr. Wenn man die infos nach vorne stellt, dann würde es vielleicht wieder gehen.
    Vielleicht fügt aber der Compiler für irgendwelches Alignement noch ein paar Bytes hinzu...

    [quote="Toshi"]
    Jeder "normale" Programmierer wird da 64 zusammenhängende Bits im Speicher als Darstellung wählen und die Adresse auf das erste Bit legen.

    Ach? Ich dachte immer ich müßte bei meinen Klassen (nicht PODs) nicht drauf achten wie ich's baue, Hauptsache die Schnittstelle paßt. Kann ich ja nix dafür, wenn dann jemand meint mit nem Pointer an meinen Innereien rumfummeln zu müssen. Warum baust Du nicht gleich ein #define private public drüber?

    Toshi schrieb:

    Zusatzinformationen sind nicht nötig

    und das weißt Du so genau? Vielleicht kann man's mit Zusatzinfos aber schneller implementieren? Warum schaust Du Dir nicht einfach an, wie's gemacht ist?

    Ich sehe nicht, was gegen die Verwendung von int64 spricht. Das ist zwar dann nicht portabel, aber es ist wenigstens kein undefiniertes Verhalten.

    MfG Jester



  • Und mit nem typedef __int64 int64; hat man gleichzeitig ne kleine Portabilität erreicht.



  • Im Prinzip verstehe ich die Aufregung nicht!

    Das bitset besteht (soweit ich das sehe) aus einem Pointer auf ein unsigned long array und einer Art Index, den ich sowieso nicht benutze!
    Die Größe wird über den Template Parameter übergeben, die Pointer setze ich selbst und der Index ist mir fürchterlich egal!

    Außerdem dem xor und dem ostream benutze ich nichts vom bitset!

    Zugegeben, ein wenig unsauber ist es schon...
    Aber wenigstens muß ich mir so nicht die Arbeit machen, für den __int64 eine binäre Ausgabe zu basteln!

    Wegen dem aktuellen VS in der Commandline Version...
    Angesehen habe ich mir das Teil mal. Vollständig war das aber nicht, wenn ich mich recht entsinne! Habe es nicht mehr genau in Erinnerung, aber fehlt da nicht wenigstens der Linker?



  • groovemaster schrieb:

    MaSTaH schrieb:

    C++ kennt keine Bitangaben der Builtins.

    Was hat das mit meiner Aussage zu tun?

    Deine Aussage war falsch...

    groovemaster schrieb:

    Kannst du mir einen Standard Built-in Typ nennen, den ich unter einer 32 Bit Plattform für 64 Bit Integer verwenden kann?

    Es gibt mehr als nur 32-Bit-Plattformen.



  • Toshi schrieb:

    Zugegeben, ein wenig unsauber ist es schon...

    Es ist eben nicht nur unsauber, sondern auch undefiniert. Das ist das blöde daran. Es funktioniert vielleicht mit ein bißchen Glück. Aber wenn es nicht tut, dann ist auch nicht der blöde Compiler oder sonstwas schuld. Wer solchen Code schreibt darf nicht erwarten, daß er funktioniert. So ist das nunmal. Bei Objekten fuhrwerkt man nicht einfach im Speicher rum wie man das möchte, sondern benutzt die Schnittstelle.

    Du könntest zum Beispiel aus zwei unsigned longs jeweils in bitset<64> erzeugen. Das eine schiebst Du um 32 bit und dann benutzt Du ein simples | um die beiden miteinander zu verknüpfen. Oder Du wechselst auf ne 64bit-Plattform. Da ist long dann 64 bit und Du kannst es direkt im Konstruktor übergeben.

    MfG Jester



  • Ich will ja nicht wirklich viel damit machen...
    Eigentlich geht es mir nur darum, zwei doubles zu xor-en, um das erste unterschiedliche Bit zu finden!
    Die Ausgabe ist nur ein Plus, um kontrollieren zu können, was passiert...

    Es würde doch eigentlich reichen, einen struct mit zwei ulongs zu bauen, die dann per reinterpret_cast über die doubles zu legen und die Komponenten paarweise zu xor-en....

    Das wäre dann doch definiert, oder??



  • MaSTaH schrieb:

    Deine Aussage war falsch...

    Und das wäre...

    MaSTaH schrieb:

    Es gibt mehr als nur 32-Bit-Plattformen.

    Was keine Antwort auf meine Frage ist. Mag sein, dass ich die Sache nicht so pragmatisch sehe wie du, aber ich gehe einfach mal davon aus, dass Toshi's Programm auf gängiger IA32 Hardware laufen soll und nicht auf einem Toaster.



  • Toshi schrieb:

    Ich will ja nicht wirklich viel damit machen...
    Eigentlich geht es mir nur darum, zwei doubles zu xor-en, um das erste unterschiedliche Bit zu finden!
    Die Ausgabe ist nur ein Plus, um kontrollieren zu können, was passiert...

    Es würde doch eigentlich reichen, einen struct mit zwei ulongs zu bauen, die dann per reinterpret_cast über die doubles zu legen und die Komponenten paarweise zu xor-en....

    Das wäre dann doch definiert, oder??

    Es ist sogar gaengige Praxis, einen 64-Bit-Typ per struct zu repraesentieren:

    struct int64 {
        unsigned long h;
        unsigned long l;
    };
    

    Z. B. wird das bei uns in der Firma so gemacht. Natuerlich muss man, um mit
    diesen Typen rechnen zu koennen, entsprechende Operationen zur Verfuegung
    stellen.

    Und die restliche Diskussion hier ist eigentlich unnoetig. Wenn ihr euch
    einfach darauf verlassen wollt, dass irgend ein Umstand "wohl auf einem XY
    System funktionieren wird", dann koennt ihr das ja tun. Aber wundert euch
    nicht, wenn es dann nicht funktioniert. Und falls ihr in einer Firma seid
    und z. B. ein Warenwirtschaftssystem (wie komm ich bloss darauf :))
    entwickelt, bei welchem staendig mit Geldbetraegen gerechnet wird, dann werdet
    ihr euch hoffentlich _nicht_ auf so etwas verlassen. Denn wenn es mal nicht
    hinhaut, koennen eure Kunden viel Geld verlieren und das ist gar nicht gut.

    mfg
    v R


Anmelden zum Antworten