<?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[[Anfänger] Abbruchbedingung für Schleife]]></title><description><![CDATA[<p>Hallo,</p>
<p>Folgendes Problem: ich habe zwei Variablen b1,b2 vom Typ bool, die in einer Schleife neu berechnet werden. Die Schleife soll genau dann beendet werden, wenn die Werte für b1 und b2 (als Paar betrachtet) bereits einmal vorgekommen sind.</p>
<pre><code>bool b1=initB1();
bool b2=initB2();

while (Paar [b1,b2] noch nicht vorgekommen) {
	unterprogramm(b1, b2);
	b1 = berechneB1();
	b2 = berechneB2();
}
</code></pre>
<p>Zur Illustration zwei mögliche Abläufe:</p>
<pre><code>b1      b2         b1      b2
false   false      true    false
false   true       true    false
true    true		
false   true
</code></pre>
<p>Ich suche eine möglichst elegante (und schnelle) Implementierung für die Abbruchbedingung.<br />
Eine mögliche nicht elegante Lösung ist: 4 zusätzliche bool Variablen definieren (bool falsefalse, falsetrue, truefalse, truetrue), innerhalb der Schleife abhängig von b1, b2 auf true setzen, und dann im while-Ausdruck prüfen, ob eine davon bereits true ist.</p>
<p>Danke für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/211774/anfänger-abbruchbedingung-für-schleife</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 10:21:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/211774.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Apr 2008 12:22:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Anfänger] Abbruchbedingung für Schleife on Sun, 27 Apr 2008 12:22:40 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Folgendes Problem: ich habe zwei Variablen b1,b2 vom Typ bool, die in einer Schleife neu berechnet werden. Die Schleife soll genau dann beendet werden, wenn die Werte für b1 und b2 (als Paar betrachtet) bereits einmal vorgekommen sind.</p>
<pre><code>bool b1=initB1();
bool b2=initB2();

while (Paar [b1,b2] noch nicht vorgekommen) {
	unterprogramm(b1, b2);
	b1 = berechneB1();
	b2 = berechneB2();
}
</code></pre>
<p>Zur Illustration zwei mögliche Abläufe:</p>
<pre><code>b1      b2         b1      b2
false   false      true    false
false   true       true    false
true    true		
false   true
</code></pre>
<p>Ich suche eine möglichst elegante (und schnelle) Implementierung für die Abbruchbedingung.<br />
Eine mögliche nicht elegante Lösung ist: 4 zusätzliche bool Variablen definieren (bool falsefalse, falsetrue, truefalse, truetrue), innerhalb der Schleife abhängig von b1, b2 auf true setzen, und dann im while-Ausdruck prüfen, ob eine davon bereits true ist.</p>
<p>Danke für eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1498971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1498971</guid><dc:creator><![CDATA[glis]]></dc:creator><pubDate>Sun, 27 Apr 2008 12:22:40 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Abbruchbedingung für Schleife on Sun, 27 Apr 2008 12:36:49 GMT]]></title><description><![CDATA[<p>Du könntest eine Funktion schreiben, die der Kombination ein Integer zuweist - nach folgender Art:</p>
<pre><code class="language-cpp">short Kombination(bool a, bool b)
{
    return a + 2*b;
}
</code></pre>
<p>Diese gibt für jede Möglichkeit einen anderen Wert (zwischen 0 und 3) heraus.<br />
Du könntest (wegen der Geschwindigkeit) mit Flags abprüfen, ob die Kombination bereits vorgekommen ist. Ansonsten kannst du ein bool-Array mit 4 Elementen machen, die zu Beginn alle false sind und beim Vorkommen der bestimmten Kombination auf true gesetzt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1498981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1498981</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 27 Apr 2008 12:36:49 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Abbruchbedingung für Schleife on Sun, 27 Apr 2008 12:38:03 GMT]]></title><description><![CDATA[<p>Wie ich das sehe kommst du nicht umhin das irgendwie in einer Variablen zu speichern. Ob du das jetzt in 4 bool's machst, oder in einem int spielt ja nicht so eine Rolle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1498982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1498982</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 27 Apr 2008 12:38:03 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Abbruchbedingung für Schleife on Sun, 27 Apr 2008 12:47:19 GMT]]></title><description><![CDATA[<p>glis schrieb:</p>
<blockquote>
<p>Eine mögliche nicht elegante Lösung ist: 4 zusätzliche bool Variablen definieren (bool falsefalse, falsetrue, truefalse, truetrue), innerhalb der Schleife abhängig von b1, b2 auf true setzen, und dann im while-Ausdruck prüfen, ob eine davon bereits true ist.</p>
</blockquote>
<p>Ich denke jedoch, meine Lösung ist immer noch besser als die nicht-elegante von ihm <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Aber du hast schon Recht, speichern muss man die bereits vorgekommenen Kombinationen so oder so. Wenn man allerdings direkt auf einen Array-Index zugreifen kann oder sogar auf einen Flag-Integer, ist das wohl schneller als alle vier zu überprüfen. Und was die Speicherung anbelangt: eine Funktion ist wohl auch schneller als 4 If-Abfragen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1498985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1498985</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 27 Apr 2008 12:47:19 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Abbruchbedingung für Schleife on Sun, 27 Apr 2008 12:52:59 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>glis schrieb:</p>
<blockquote>
<p>Eine mögliche nicht elegante Lösung ist: 4 zusätzliche bool Variablen definieren (bool falsefalse, falsetrue, truefalse, truetrue), innerhalb der Schleife abhängig von b1, b2 auf true setzen, und dann im while-Ausdruck prüfen, ob eine davon bereits true ist.</p>
</blockquote>
<p>Ich denke jedoch, meine Lösung ist immer noch besser als die nicht-elegante von ihm <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Aber du hast schon Recht, speichern muss man die bereits vorgekommenen Kombinationen so oder so. Wenn man allerdings direkt auf einen Array-Index zugreifen kann oder sogar auf einen Flag-Integer, ist das wohl schneller als alle vier zu überprüfen. Und was die Speicherung anbelangt: eine Funktion ist wohl auch schneller als 4 If-Abfragen.</p>
</blockquote>
<p>Ich glaube du wolltest mich zitieren. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Recht hast du schon,ich habe ja nicht gesagt, wie er es machen muss. Mann kann natürlich auch mit Bit Manipulation arbeiten, aber ich denke mal, dass das in dem Fall so, oder so nichts/viel bringt. 4 ist so eine schöne Zahl, da kann man soo viele Lösungen dazu finden das elegant/schnell zu implementieren. <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/1498990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1498990</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 27 Apr 2008 12:52:59 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Abbruchbedingung für Schleife on Sun, 27 Apr 2008 15:22:24 GMT]]></title><description><![CDATA[<p>Nein, ich wollte Stellung nehmen zum Anspruch des Threaderstellers auf Eleganz <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Man muss ja nicht immer seinen Vorposter zitieren, wenn man ihm antwortet...</p>
<p>Also, ich hab mal die beiden Varianten auf Geschwindigkeit getestet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Benötigte Zeit für 100 Millionen Aufrufe, wobei die 2 Bool-Variabeln zufällig erzeugt werden:<br />
* 4 Bool-Variabeln, if-Abfragen: ~30s<br />
* Funktionen, Flag-Integer: ~8.5s</p>
<p>Achja, sind folgende Funktionen eigentlich performant? Ich hab das Gefühl, eher nicht; ich kenn mich fast kaum mit Flags aus... Würde es sich lohnen, sie inline zu machen? Ich hab keinen Zeitunterschied erkannt. Und Übergabe der Parameter als konstante Referenzen scheint auch keinen wirklichen Einfluss zu haben...</p>
<pre><code class="language-cpp">bool GetFlag(short Bin, short Flag)
{
	return (Bin &amp; (1 &lt;&lt; Flag)) &gt;&gt; Flag; // das geht doch sicher einfacher, oder?
}

void SetFlag(short &amp;Bin, short Flag)
{
	Bin |= 1 &lt;&lt; Flag; // hier siehts wahrscheinlich besser aus
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1499062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499062</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 27 Apr 2008 15:22:24 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Abbruchbedingung für Schleife on Sun, 27 Apr 2008 16:06:44 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">bool GetFlag(short Bin, short Flag)
{
	return (Bin &amp; (1 &lt;&lt; Flag)) &gt;&gt; Flag; // das geht doch sicher einfacher, oder?
}
</code></pre>
</blockquote>
<pre><code class="language-cpp">bool GetFlag(short bin, short flag) {
    return bin &amp; (1 &lt;&lt; flag);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1499088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499088</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sun, 27 Apr 2008 16:06:44 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Abbruchbedingung für Schleife on Sun, 27 Apr 2008 18:02:12 GMT]]></title><description><![CDATA[<p>Vielen Dank, ich wusste es! <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="🙂"
    /><br />
Jetzt ist mein Algorithmus wieder 2% schneller <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Eigentlich ist es ja klar, ein bool-Wert ist ja immer true wenn er nicht 0 ist...</p>
<p>Was kann man gegen folgende Warnung tun? Ich meine jetzt nicht deaktivieren. <code>static_cast&lt;bool&gt;</code> bringt auch nichts...<br />
<em>1&gt;.\Main.cpp(9) : warning C4800: 'int': Variable wird auf booleschen Wert ('True' oder 'False') gesetzt (Auswirkungen auf Leistungsverhalten möglich)</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499155</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 27 Apr 2008 18:02:12 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Abbruchbedingung für Schleife on Sun, 27 Apr 2008 18:07:48 GMT]]></title><description><![CDATA[<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499157</guid><dc:creator><![CDATA[Superobtimiar]]></dc:creator><pubDate>Sun, 27 Apr 2008 18:07:48 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Abbruchbedingung für Schleife on Sun, 27 Apr 2008 19:38:49 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Also, ich hab mal die beiden Varianten auf Geschwindigkeit getestet <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Benötigte Zeit für 100 Millionen Aufrufe, wobei die 2 Bool-Variabeln zufällig erzeugt werden:<br />
* 4 Bool-Variabeln, if-Abfragen: ~30s<br />
* Funktionen, Flag-Integer: ~8.5s</p>
<pre><code class="language-cpp">bool GetFlag(short Bin, short Flag)
{
	return (Bin &amp; (1 &lt;&lt; Flag)) &gt;&gt; Flag; // das geht doch sicher einfacher, oder?
}

void SetFlag(short &amp;Bin, short Flag)
{
	Bin |= 1 &lt;&lt; Flag; // hier siehts wahrscheinlich besser aus
}
</code></pre>
</blockquote>
<p>Genial. Danke Nexus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499233</guid><dc:creator><![CDATA[glis]]></dc:creator><pubDate>Sun, 27 Apr 2008 19:38:49 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Abbruchbedingung für Schleife on Sun, 27 Apr 2008 19:56:13 GMT]]></title><description><![CDATA[<p>Hier noch einmal der komplette Code, ich hab noch etwas abgeändert (z.B. Multiplikation mit 2 durch Shift-Operation ersetzt^^)</p>
<pre><code class="language-cpp">// Rückgabe: Wert in [0,3] für eine der 4 möglichen Kombinationen
short Combination(bool a, bool b)
{ 
    return a + (b &lt;&lt; 1); 
}

// Gibt das Bit an der Stelle 'Flag' des Integers 'Bin' zurück (erstes Bit hat Stelle 0)
bool GetFlag(short Bin, short Flag)
{
	return Bin &amp; (1 &lt;&lt; Flag);
}

// Setzt das Bit an der Stelle 'Flag' des Integers 'Bin' auf 1
void SetFlag(short &amp;Bin, short Flag)
{
	Bin |= 1 &lt;&lt; Flag;
}

int main()
{
	short FlagInt = 0;
    bool x, y; // deine beiden Bool-Werte, musst du noch initialisieren (in Schleife)
	while (true) // läuft, bis eine Kombination mehrfach vorkommt; maximal 4 Durchgänge
	{
		short k = Combination(x, y);
		if (GetFlag(FlagInt, k))
			break;
		SetFlag(FlagInt, k);
	}
	system(&quot;Pause&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1499245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499245</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 27 Apr 2008 19:56:13 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Abbruchbedingung für Schleife on Sun, 27 Apr 2008 20:08:42 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Hier noch einmal der komplette Code, ich hab noch etwas abgeändert (z.B. Multiplikation mit 2 durch Shift-Operation ersetzt^^)</p>
</blockquote>
<p>Genau das hab ich mir unter &quot;elegant&quot; vorgestellt. Nochmal vielen herzlichen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499254</guid><dc:creator><![CDATA[glis]]></dc:creator><pubDate>Sun, 27 Apr 2008 20:08:42 GMT</pubDate></item><item><title><![CDATA[Reply to [Anfänger] Abbruchbedingung für Schleife on Sun, 27 Apr 2008 20:44:23 GMT]]></title><description><![CDATA[<p>glis schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Hier noch einmal der komplette Code, ich hab noch etwas abgeändert (z.B. Multiplikation mit 2 durch Shift-Operation ersetzt^^)</p>
</blockquote>
<p>Genau das hab ich mir unter &quot;elegant&quot; vorgestellt. Nochmal vielen herzlichen Dank!</p>
</blockquote>
<p>Multiplikation mit zwei und Shift-Operationen sind für den Compiler dasselbe. Keins der beiden ist daher effizienter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1499273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1499273</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sun, 27 Apr 2008 20:44:23 GMT</pubDate></item></channel></rss>