Binär zu Dezimal mit Template ?



  • Ich habe in diesem Forum folgende Templates zur Umwandlung von Binärzahlen in Dezimalzahlen gefunden:
    template <int Value> struct is_binary_digit;
    template <> struct is_binary_digit<0> { enum {Result = 0}; };
    template <> struct is_binary_digit<1> { enum {Result = 1}; };
    template <int Value> struct binary;
    template <> struct binary<0> { enum {Result = 0}; };
    template <int Value> struct binary {
    enum {Result = is_binary_digit<Value%10>::Result + 2 * binary<Value/10>::Result}; };
    Ersichtlich führt das Template folgende Berechnung durch:
    digit_1 x 2^(n-1) + digit_2 x 2^(n-2) .....digit_n x ^(n-n)
    mit n<=10 und Zählung der Ziffern der Binärzahl von links nach rechts.
    Trotz passabler Fertigkeiten in C/C++ und auch mit Grundkenntnissen der Syntax von Templates, jedoch als Autodidakt und nicht Informatiker und nicht Mathematiker verstehe ich die Syntax und den Mechanismus insbesondere der Anweisung im letzten Template nicht. Auch das Buch von Vandevoorde, Josuttis und Gregor, 2. Edt. hat mir nicht weiter geholfen. Ich wäre dankbar und würde mich freuen, wenn sich ein Mitglied des Forums die Mühe machen würde, mir den Algorithmus zu erklären



  • Stell dir einfach vor, du würdest das von Hand eintippen, und immer die variablen Teile ensprechen der Vorschrift ersetzen. Nehmen wir ein Beispiel wie 101

    template <int Value> struct binary
    {
        enum 
        {
            Result = is_binary_digit<Value%10>::Result + 2 * binary<Value/10>::Result
        }; 
    };
    
    //Value mit 101 ersetzen
    struct binary<101>
    {
        enum
        {
            Result = is_binary_digit<101%10>::Result + 2 * binary<101/10>::Result
        };
    };
    
    // % und / ausrechnen
    struct binary<101>
    {
        enum
        {
            Result = is_binary_digit<1>::Result + 2 * binary<10>::Result
        };
    };
    
    // is_binary_digit::Result durch das andere Template oben ersetzen
    struct binary<101>
    {
        enum
        {
            Result =1 + 2 * binary<10>::Result
        };
    };
    
    // binary<10> ersetzen, mist kenn ich nicht muss ich erstmal bauen, also Value 10 einsetzen
    struct binary<10>
    {
        enum
        {
            Result = is_binary_digit<10%10>::Result + 2 * binary<10/10>::Result
        };
    };
    
    

    Und das wars im Prinzip schon, das immer weider durchführen bis man den binary<0> hat und den kann man direkt durch die Spezialisierung von weiter oben ersetzen. Es ist echt nichts weiter als stures ausformulieren der Regel.



  • @jwawersik sagte in Binär zu Dezimal mit Template ?:

    Trotz passabler Fertigkeiten in C/C++ und auch mit Grundkenntnissen der Syntax von Templates, jedoch als Autodidakt und nicht Informatiker und nicht Mathematiker verstehe ich die Syntax und den Mechanismus insbesondere der Anweisung im letzten Template nicht.

    Das Ganze ist letztenendes auch ein übler Hack, um solche Berechnungen zur Compilezeit ausführen zu können. Das ist mit aktuellen Compilern aber oft auch nicht nötig.

    1. es gibt endlich binäre Literale: 0b101
    2. es gibt constexpr Funktionen, die etwas zur Compilezeit berechnen
    3. es gibt if constexpr. Damit lässt sich so etwas auch lesbarer schreiben


  • @manni66 Wenn das für dich schon ein übler Hack ist, dann hast du noch keine wirklich üblen Hacks gesehen 😉


Log in to reply