<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[schnellerer Algorithmus]]></title><description><![CDATA[<p>Hey,<br />
ich bin gerade dabei, ein Programm zu schreiben, das Zahlen aus dem Dezimalsystem in Zahlen des 7er Systems umwandeln soll. Ich habe bereits folgendens:</p>
<pre><code class="language-cpp">int Class::dec_sep(int dec){
    std::string sep=&quot;&quot;;
    while(dec!=0){
        std::stringstream out;
        out&lt;&lt;dec%7;
        sep=out.str()+sep;
        dec/=7;
    }
    return atoi(sep.c_str());
}
</code></pre>
<p>Nun will ich aber sehr viele Zahlen hintereinander umwandeln und mit dieser Funktion dauert das ewig. Gibt es eine Möglichkeit, das effizienter zu programmieren?<br />
Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/283158/schnellerer-algorithmus</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 18:14:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/283158.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 06 Mar 2011 17:04:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to schnellerer Algorithmus on Sun, 06 Mar 2011 17:04:24 GMT]]></title><description><![CDATA[<p>Hey,<br />
ich bin gerade dabei, ein Programm zu schreiben, das Zahlen aus dem Dezimalsystem in Zahlen des 7er Systems umwandeln soll. Ich habe bereits folgendens:</p>
<pre><code class="language-cpp">int Class::dec_sep(int dec){
    std::string sep=&quot;&quot;;
    while(dec!=0){
        std::stringstream out;
        out&lt;&lt;dec%7;
        sep=out.str()+sep;
        dec/=7;
    }
    return atoi(sep.c_str());
}
</code></pre>
<p>Nun will ich aber sehr viele Zahlen hintereinander umwandeln und mit dieser Funktion dauert das ewig. Gibt es eine Möglichkeit, das effizienter zu programmieren?<br />
Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2030475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030475</guid><dc:creator><![CDATA[Gaast]]></dc:creator><pubDate>Sun, 06 Mar 2011 17:04:24 GMT</pubDate></item><item><title><![CDATA[Reply to schnellerer Algorithmus on Sun, 06 Mar 2011 17:12:36 GMT]]></title><description><![CDATA[<p>Vielleicht solltest Du nicht vom 10-er-System ins 7-er-System wandeln, sondern vom 1000-er-System ins 2401-er-System.<br />
Die Zahl im 7-er System gibst Du in einem int zurück, komisch, hätte mir kaum was anderes als char[13] denken können. Oder meinetwegen string.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2030483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030483</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 06 Mar 2011 17:12:36 GMT</pubDate></item><item><title><![CDATA[Reply to schnellerer Algorithmus on Sun, 06 Mar 2011 17:31:09 GMT]]></title><description><![CDATA[<p>Ok, das ist die sinnloseste Funktion die ich je gesehen hab <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2030491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030491</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 06 Mar 2011 17:31:09 GMT</pubDate></item><item><title><![CDATA[Reply to schnellerer Algorithmus on Sun, 06 Mar 2011 17:33:51 GMT]]></title><description><![CDATA[<p>Mmh... da die Zahlen ja doch dual gespeichert werden, frage ich mich:<br />
Warum überhaupt irgendetwas umwandeln?</p>
<p>Wäre es nicht einfacher, eine Funktion zu schreiben, die aus deinen Ganzzahlen bei Bedarf (d.h. string-Ausgaben - und nur dort) 7-adige ASCII-Symbolketten bilden?</p>
<p>So habe ich es zumindest gemacht, als ich char-Werte als Bitfolgen ausgeben wollte:</p>
<pre><code class="language-cpp">char * bits(const char wert)
{
  char * bitfolge = new char[sizeof(char) * 8 + 1];

  for(unsigned char z = 0; z &lt; sizeof(char) * 8; z++)
  {
    wert = wert &lt;&lt; z;
    wert = wert &gt;&gt; (sizeof(char) * 8 - 1);
    wert ? bitfolge[z] = '1' : bitfolge[z] = '0';
  }
  bitfolge[sizeof(char) * 8] = 0;

  return bitfolge;
}
</code></pre>
<p>Das Beispiel ermöglicht derlei:</p>
<pre><code class="language-cpp">cout &lt;&lt; bits(4);
</code></pre>
<p>-&gt; 00000100 auf der Konsole<br />
Ist natürlich die einfachst mögliche Umwandlung, geht aber auch mit deinem Funktionskörper und angepasster Ausgabe.</p>
<p>Wenn du tatsächlich int-Werte ausgeben möchtest, macht das doch nur Umstände, weil du bei jeder Rechnung neu mappen musst (6<sub>7</sub> + 1<sub>7</sub> ergibt ja trotzdem nicht 10<sub>7</sub>, so du die Operatoren nicht angreifst).<br />
Lieber nur einmal am Ende umrechnen, und dann kann's doch eigentlich nur zu Ausgabezwecken dienen, oder?<br />
Es wäre für Rat hier schon relevant, was du denn mit den 7-adischen Werten anfangen möchtest, bzw. wo und wie sie zum Einsatz kommen sollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2030493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030493</guid><dc:creator><![CDATA[Zsar]]></dc:creator><pubDate>Sun, 06 Mar 2011 17:33:51 GMT</pubDate></item><item><title><![CDATA[Reply to schnellerer Algorithmus on Sun, 06 Mar 2011 17:40:17 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">char * bits(const char wert)//const unnötig
{
  char * bitfolge = new char[sizeof(char) * 8 + 1];//sizeof(char) ist immer 1

  for(unsigned char z = 0; z &lt; sizeof(char) * 8; z++)//zum zählen int nehmen
  {
    wert = wert &lt;&lt; z;//seltsame 
    wert = wert &gt;&gt; (sizeof(char) * 8 - 1);//bitextraktion
    wert ? bitfolge[z] = '1' : bitfolge[z] = '0';
  }
  bitfolge[sizeof(char) * 8] = 0;

  return bitfolge;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2030495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030495</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 06 Mar 2011 17:40:17 GMT</pubDate></item><item><title><![CDATA[Reply to schnellerer Algorithmus on Sun, 06 Mar 2011 19:32:35 GMT]]></title><description><![CDATA[<p>Na nun, dass es sehr elegant wäre, habe ich nicht behauptet.<br />
Wollte nur bitweises Auslesen zum Zwecke einer unüblichen Formatierung demonstrieren, bzw. bei der Erstellung des Codes die Aufgabe an sich gelöst haben.</p>
<p>... Nun ist allerdings meine Neugier geweckt, was an der Bitextration so seltsam sein soll - ist eine von nur zwei Möglichkeiten, die mir spontan in den Sinn kommen,<br />
die andere wäre bitweises und-Verknüpfen mit 2^z und Wahrheitswert prüfen.<br />
Sollte das etwa weit besser sein, als zweimaliges Verschieben?</p>
<pre><code class="language-cpp">for(unsigned char z = 1, i = 0; z != 0; z = z &lt;&lt; 1, i++)
{
  (wert &amp; z) ? bitfolge[i] = '1' : bitfolge[i] = '0';
}
</code></pre>
<p>Sieht nicht unbedingt besser aus - gut, das i kann man noch herauskürzen (ich komme nur gerade nicht darauf), aber selbst dann...</p>
<p>Nachtrag:<br />
Das i wird man per Logarithmus los: i = log<sub>2</sub>z. Bäh!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2030531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030531</guid><dc:creator><![CDATA[Zsar]]></dc:creator><pubDate>Sun, 06 Mar 2011 19:32:35 GMT</pubDate></item><item><title><![CDATA[Reply to schnellerer Algorithmus on Sun, 06 Mar 2011 19:40:02 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Vielleicht solltest Du nicht vom 10-er-System ins 7-er-System wandeln, sondern vom 1000-er-System ins 2401-er-System.</p>
</blockquote>
<p>Stimmt, da gab's irgendeinen Trick. Wie kommst du auf 10^3 vs 7^4? Beliebig wirst du das ja nicht gewählt haben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2030541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030541</guid><dc:creator><![CDATA[nicht Gaast]]></dc:creator><pubDate>Sun, 06 Mar 2011 19:40:02 GMT</pubDate></item><item><title><![CDATA[Reply to schnellerer Algorithmus on Sun, 06 Mar 2011 19:43:37 GMT]]></title><description><![CDATA[<p>nicht Gaast schrieb:</p>
<blockquote>
<p>Wie kommst du auf 10^3 vs 7^4? Beliebig wirst du das ja nicht gewählt haben?</p>
</blockquote>
<p>Klein genug, daß man an eine Look-Up-Tabelle denken könnte. Aber eher geraten, hab's noch nie mit Tabelle ausprobiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2030544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030544</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 06 Mar 2011 19:43:37 GMT</pubDate></item><item><title><![CDATA[Reply to schnellerer Algorithmus on Sun, 06 Mar 2011 20:02:12 GMT]]></title><description><![CDATA[<p>LordZsar1 schrieb:</p>
<blockquote>
<p>die andere wäre bitweises und-Verknüpfen mit 2^z und Wahrheitswert prüfen.</p>
</blockquote>
<p>Ich denke, es gibt da sehr viele Möglichkeiten.<br />
&quot;seltsam&quot; war Deine, weil ich gleich gesehen hatte, daß die so nicht klappt. Falsch, ich konnte nicht gleich sehen, daß es so klappt. Das kam mir spanisch vor.<br />
Eine mögliche Reparatur ginge so</p>
<pre><code class="language-cpp">char * bits(const char owert)
{
    char * bitfolge = new char[sizeof(char) * 8 + 1];

    for(unsigned char z = 0; z &lt; sizeof(char) * 8; z++)
    {
        char wert=owert;
        wert = wert &lt;&lt; z;
        wert = wert &gt;&gt; (sizeof(char) * 8 - 1);
        wert ? bitfolge[z] = '1' : bitfolge[z] = '0';
    }
    bitfolge[sizeof(char) * 8] = 0;

    return bitfolge;
}
</code></pre>
<p>aber dann drängt sich sofort sowas</p>
<pre><code class="language-cpp">char * bits(const char owert)
{
    char * bitfolge = new char[sizeof(char) * 8 + 1];

    char wert=owert;
    for(unsigned char z = 0; z &lt; sizeof(char) * 8; z++)
    {
        wert &amp; 128 ? bitfolge[z] = '1' : bitfolge[z] = '0';
        wert = wert &lt;&lt; 1;
    }
    bitfolge[sizeof(char) * 8] = 0;

    return bitfolge;
}
</code></pre>
<p>auf.</p>
<p>Aber spaßig wird's erst mit der 7 als Basis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2030549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030549</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 06 Mar 2011 20:02:12 GMT</pubDate></item><item><title><![CDATA[Reply to schnellerer Algorithmus on Mon, 07 Mar 2011 21:22:13 GMT]]></title><description><![CDATA[<p>Bleibt noch zu erwähnen, wie man den Algorithmus in den ostream rein bekommt, damit die Zahlen auch ausgegeben werden. Da der 'num_put' lange nicht dran war - hier noch mal komplett:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;locale&gt;
#include &lt;cassert&gt;

template&lt; int Base, typename E, typename Out, typename I &gt;
Out put_number( Out out, I x )
{
    assert( x &gt;= 0 );
    const I digit = x % Base;
    if( (x /= Base) != I(0) )
        out = put_number&lt; Base, E &gt;( out, x );
    *out++ = E( (digit &lt; 10? '0': 'a' - 10) + digit );
    return out;
}

template&lt; int Base, typename E &gt;
class UserBase : public std::num_put&lt; E &gt;
{
protected:
    virtual iter_type do_put( iter_type out, std::ios_base&amp; str, char_type fill, long val ) const
    {
        if( str.flags() &amp; std::ios_base::basefield )
            return std::num_put&lt; E &gt;::do_put( out, str, fill, val );
        if( val &lt; 0 )
        {
            *out++ = '-';
            val = -val;
        }
        out = put_number&lt; Base, E &gt;( out, val );
        if( out.failed() )
            str.setstate( std::ios_base::failbit );
        return out;
    }
};
template&lt; int Base, typename E, typename Traits &gt;
void imbue_base( std::basic_ostream&lt; E, Traits &gt;&amp; out )
{
    out.imbue( std::locale( out.getloc(), new UserBase&lt; Base, E &gt; ) );
}
template&lt; typename E, typename Traits &gt;
std::basic_ostream&lt; E, Traits &gt;&amp; user_base( std::basic_ostream&lt; E, Traits &gt;&amp; str )
{
    str.unsetf( std::ios_base::basefield );
    return str;
}

int main()
{
    using namespace std;
    imbue_base&lt; 7 &gt;( cout ); // ab jetzt können Zahlen auf cout zur Basis7 ausgegeben werden
    for( int i = 14; i &lt; 36; ++i ) // Demo
        cout &lt;&lt; dec &lt;&lt; i &lt;&lt; &quot; = &quot; &lt;&lt; user_base &lt;&lt; i &lt;&lt; &quot;_sieben&quot; &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031009</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 07 Mar 2011 21:22:13 GMT</pubDate></item></channel></rss>