<?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[Problem mit Bitoperatoren und enums]]></title><description><![CDATA[<p>Entschuldigung für den Doppelpost, aber ich wollte keinen eigenen Thread für die kleine Frage erstellen.</p>
<p>folgender Code:</p>
<pre><code>// Enum-Definition
enum Style {STYLE1, STYLE2, STYLE3};
// Funktionsdeklaration
void Func(Style newStyle);

// So geht's
Func(STYLE2);
// Das geht schief
Func(STYLE1|STYLE2);
// So geht's wieder
Func(Style(STYLE1|STYLE2)); //&lt;--
</code></pre>
<p>In der letzten Anweisung werden der Funktion 2 Stile durch Veroderung übergeben. Dabei muss die Veroderung wieder in einen Stil umgewandelt werden. Allerdings verstehe ich nicht, wie das funktionieren soll, bzw. was da abläuft und was schlussendlich der Funktion dann übergeben wird.</p>
<p>Danke schonmal für die Hilfe</p>
<p>Don Quijote</p>
<p>EDIT Phoemuex: Themen geteilt, daher passt das mit dem Doppelpost nicht mehr ganz</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/225120/problem-mit-bitoperatoren-und-enums</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 20:28:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/225120.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Oct 2008 11:42:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Bitoperatoren und enums on Sun, 19 Oct 2008 17:01:23 GMT]]></title><description><![CDATA[<p>Entschuldigung für den Doppelpost, aber ich wollte keinen eigenen Thread für die kleine Frage erstellen.</p>
<p>folgender Code:</p>
<pre><code>// Enum-Definition
enum Style {STYLE1, STYLE2, STYLE3};
// Funktionsdeklaration
void Func(Style newStyle);

// So geht's
Func(STYLE2);
// Das geht schief
Func(STYLE1|STYLE2);
// So geht's wieder
Func(Style(STYLE1|STYLE2)); //&lt;--
</code></pre>
<p>In der letzten Anweisung werden der Funktion 2 Stile durch Veroderung übergeben. Dabei muss die Veroderung wieder in einen Stil umgewandelt werden. Allerdings verstehe ich nicht, wie das funktionieren soll, bzw. was da abläuft und was schlussendlich der Funktion dann übergeben wird.</p>
<p>Danke schonmal für die Hilfe</p>
<p>Don Quijote</p>
<p>EDIT Phoemuex: Themen geteilt, daher passt das mit dem Doppelpost nicht mehr ganz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600774</guid><dc:creator><![CDATA[Don Quijote]]></dc:creator><pubDate>Sun, 19 Oct 2008 17:01:23 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Bitoperatoren und enums on Sat, 18 Oct 2008 13:01:46 GMT]]></title><description><![CDATA[<p>Don Quijote schrieb:</p>
<blockquote>
<p>Entschuldigung für den Doppelpost, aber ich wollte keinen eigenen Thread für die kleine Frage erstellen.</p>
</blockquote>
<p>Bitte immer für separate Fragen auch separate Threads. Das ist besonders hilfreich weil andere u.a. nach dem Titel suchen.</p>
<p>Warum du probleme mit dem enum hast, ist ganz einfach: Ein enum dient dazu eine bestimmte Anzahl an Werten zuzulassen, es ist kein Flag. Zumal diese Kombination auch nicht zwangsweise das macht was du willst.</p>
<p>Nehmen wir mal dein enum (und bitte die C/C++-Tags, und nicht die Code-Tags verwenden):</p>
<pre><code class="language-cpp">// Enum-Definition
enum Style {STYLE1, STYLE2, STYLE3};
</code></pre>
<p>Das schreibe ich mal wie es wohl interpretiert wird:</p>
<pre><code class="language-cpp">// Enum-Definition
enum Style {
  STYLE1 = 0,
  STYLE2 = 1,
  STYLE3 = 2
};
</code></pre>
<p>Eine Oderverknüpfung zwischen 0x0000 (STYLE1) und 0x0001 (STYLE2) ergibt 0x0001 (STYLE2). Wohl kaum das gewünschte...</p>
<p>Wenn du mit Flags arbeiten willst, solltest du<br />
a) Beim Enum die Wertigkeit angeben<br />
b) Einen Integralen Datentyp (int, long...) zur Übergabe verwenden</p>
<pre><code class="language-cpp">// Enum-Definition
enum Style {
  STYLE1 = 0x0001, // Bit 1 gesetzt
  STYLE2 = 0x0002, // Bit 2 gesetzt
  STYLE3 = 0x0004  // Bit 3 gesetzt
};

void Func(int newStyle);

// Nun klappen auch die aufrufe:

// So geht's
Func(STYLE2);
// Das geht schief
Func(STYLE1|STYLE2);
</code></pre>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600796</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Sat, 18 Oct 2008 13:01:46 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Bitoperatoren und enums on Sat, 18 Oct 2008 14:43:57 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Wenn du mit Flags arbeiten willst, solltest du [...] Einen Integralen Datentyp (int, long...) zur Übergabe verwenden</p>
</blockquote>
<p>Da würde ich aber lieber gleich den Enum-Typen <code>Style</code> als Parametertyp nehmen, wenn du ihn schon extra angibst. Wobei sich das bei der OR-Operation vielleicht nicht lohnt, da man casten müsste...</p>
<p>asc schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Das geht schief
Func(STYLE1|STYLE2);
</code></pre>
</blockquote>
<p>Was geht hier schief?</p>
<p>Um mit Flags zu arbeiten, könnte man aber auch ein <code>std::bitset</code> verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600834</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 18 Oct 2008 14:43:57 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Bitoperatoren und enums on Sat, 18 Oct 2008 14:50:16 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Don Quijote schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Das geht schief
Func(STYLE1|STYLE2);
</code></pre>
</blockquote>
<p>Was geht hier schief?</p>
</blockquote>
<p>Ganz einfach:<br />
Aus <code>STYLE1 | STYLE2</code> kommt ein <code>int</code> heraus und nicht wie erwartet ein <code>enum</code> . Daher muss man casten.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600837</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 18 Oct 2008 14:50:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Bitoperatoren und enums on Sat, 18 Oct 2008 14:52:43 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Ganz einfach:<br />
Aus <code>STYLE1 | STYLE2</code> kommt ein <code>int</code> heraus und nicht wie erwartet ein <code>enum</code> . Daher muss man casten.</p>
</blockquote>
<p>Ja, das habe ich auch erwähnt. Aber da pumuckl die Funktion mit einem <code>int</code> -Parameter deklariert hat...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600839</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 18 Oct 2008 14:52:43 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Bitoperatoren und enums on Sat, 18 Oct 2008 14:57:57 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>Ganz einfach:<br />
Aus <code>STYLE1 | STYLE2</code> kommt ein <code>int</code> heraus und nicht wie erwartet ein <code>enum</code> . Daher muss man casten.</p>
</blockquote>
<p>Ja, das habe ich auch erwähnt. Aber da pumuckl die Funktion mit einem <code>int</code> -Parameter deklariert hat...</p>
</blockquote>
<p>Achso, ich dachte du hättest von Don Quijote kopiert. Ganz übersehen, das asc das auch drin hatte. Ich denke mal er hat einfach ein Copy&amp;Paste gemacht und vergessen, die Kommentare rauszunehmen. Programmiererfehler Nummer 1 <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="😃"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600844</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 18 Oct 2008 14:57:57 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Bitoperatoren und enums on Sun, 19 Oct 2008 08:32:02 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Ich denke mal er hat einfach ein Copy&amp;Paste gemacht und vergessen, die Kommentare rauszunehmen. Programmiererfehler Nummer 1 <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="😃"
    /></p>
</blockquote>
<p>Man man man... Copy/Paste der Segen und Fluch der Programmierer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1601116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1601116</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Sun, 19 Oct 2008 08:32:02 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Bitoperatoren und enums on Sun, 19 Oct 2008 12:15:15 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Wenn du mit Flags arbeiten willst, solltest du<br />
a) Beim Enum die Wertigkeit angeben<br />
b) Einen Integralen Datentyp (int, long...) zur Übergabe verwenden</p>
<pre><code class="language-cpp">// Enum-Definition
enum Style {
  STYLE1 = 0x0001, // Bit 1 gesetzt
  STYLE2 = 0x0002, // Bit 2 gesetzt
  STYLE3 = 0x0004  // Bit 3 gesetzt
};

void Func(int newStyle);

// Nun klappen auch die aufrufe:

// So geht's
Func(STYLE2);
// Das geht schief
Func(STYLE1|STYLE2);
</code></pre>
<p>cu André</p>
</blockquote>
<p>Gut, das hat mir schonmal etwas weiter geholfen, aber was würde denn bei</p>
<pre><code class="language-cpp">Func(STYLE1|STYLE2)
</code></pre>
<p>an die Funktion übergeben werden? beide Bits oder nur 0x0002?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1601209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1601209</guid><dc:creator><![CDATA[Don Quijote]]></dc:creator><pubDate>Sun, 19 Oct 2008 12:15:15 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Bitoperatoren und enums on Sun, 19 Oct 2008 12:19:33 GMT]]></title><description><![CDATA[<p>Don Quijote schrieb:</p>
<blockquote>
<p>Gut, das hat mir schonmal etwas weiter geholfen, aber was würde denn bei</p>
<pre><code class="language-cpp">Func(STYLE1|STYLE2)
</code></pre>
<p>an die Funktion übergeben werden? beide Bits oder nur 0x0002?</p>
</blockquote>
<p>Es käme ein 0x0003 an, oder in Bits ausgedrückt:</p>
<pre><code>STYLE1     := 0000 0001 = 0x01 = 1
     STYLE2     := 0000 0010 = 0x02 = 2
STYLE1 | STYLE2 := 0000 0011 = 0x03 = 3
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1601213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1601213</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sun, 19 Oct 2008 12:19:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Bitoperatoren und enums on Sun, 19 Oct 2008 12:23:34 GMT]]></title><description><![CDATA[<p>Ok vielen Dank euch allen für die schnelle Hilfe <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/1601216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1601216</guid><dc:creator><![CDATA[Don Quijote]]></dc:creator><pubDate>Sun, 19 Oct 2008 12:23:34 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Bitoperatoren und enums on Mon, 20 Oct 2008 06:28:31 GMT]]></title><description><![CDATA[<blockquote>
<pre><code class="language-cpp">void Func( int newStyle )
</code></pre>
</blockquote>
<p>womit aber die schoene typsicherheit der enums dahin waere...<br />
Das kann nicht die beste Loesung sein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1601482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1601482</guid><dc:creator><![CDATA[zwutz]]></dc:creator><pubDate>Mon, 20 Oct 2008 06:28:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Bitoperatoren und enums on Mon, 20 Oct 2008 07:04:09 GMT]]></title><description><![CDATA[<p>Geht aber nicht anders. Außer du definierst für jeden Müll einen Enumeintrag A_AND_B, B_AND_C, A_AND_B_AND_C etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1601493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1601493</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 20 Oct 2008 07:04:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Bitoperatoren und enums on Mon, 20 Oct 2008 07:25:20 GMT]]></title><description><![CDATA[<p>Fellhuhn schrieb:</p>
<blockquote>
<p>Geht aber nicht anders.</p>
</blockquote>
<p>diesen Satz in Verbindung mit C++ zu lesen ist eine wahre Seltenheit...<br />
Fuer alles Erdenkliche existieren Patterns, also warum nicht auch fuer sowas Elementares?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1601503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1601503</guid><dc:creator><![CDATA[zwutz]]></dc:creator><pubDate>Mon, 20 Oct 2008 07:25:20 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Bitoperatoren und enums on Mon, 20 Oct 2008 07:27:38 GMT]]></title><description><![CDATA[<p>Du kannst natürlich das Ergebnis wieder zum Enum-Typ casten, dann geht es. Aber da du dann einen &quot;ungültigen&quot; Wert bekommen kannst, bringt dir der ganze Enum-Klumbatsch eh nichts mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1601505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1601505</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 20 Oct 2008 07:27:38 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Bitoperatoren und enums on Mon, 20 Oct 2008 08:48:00 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;

enum A
{
    AFlag1 = 1,
    AFlag2 = 2,
    AFlag3 = 4,
    AFlag4 = 8,
};

enum B
{
    BFlag1 = 1,
    BFlag2 = 2,
    BFlag3 = 4,
    BFlag4 = 8,
};

template&lt;typename Enum&gt;
class Flags
{
    typedef void** Zero;
    int i;
public:
    typedef Enum enum_type;
    Flags( const Flags&amp; f ) : i( f.i ) {}
    Flags( Enum f ) : i( f ) {}
    Flags( Zero = 0 ) : i( 0 ) {}

    Flags&amp; operator=( const Flags&amp; f ) { i = f.i; return *this; }
    Flags&amp; operator&amp;=( int mask ) { i &amp;= mask; return *this; }
    Flags&amp; operator&amp;=( uint mask ) { i &amp;= mask; return *this; }
    Flags&amp; operator|=( Flags f ) { i |= f.i; return *this; }
    Flags&amp; operator|=( Enum f ) { i |= f; return *this; }
    Flags&amp; operator^=( Flags f ) { i ^= f.i; return *this; }
    Flags&amp; operator^=( Enum f ) { i ^= f; return *this; }

    operator int() const { return i; }

    Flags operator|( Flags f ) const { Flags g; g.i = i | f.i; return g; }
    Flags operator|( Enum f ) const { Flags g; g.i = i | f; return g; }
    Flags operator^( Flags f ) const { Flags g; g.i = i ^ f.i; return g; }
    Flags operator^( Enum f ) const { Flags g; g.i = i ^ f; return g; }
    Flags operator&amp;( int mask ) const { Flags g; g.i = i &amp; mask; return g; }
    Flags operator&amp;( uint mask ) const { Flags g; g.i = i &amp; mask; return g; }
    Flags operator&amp;( Enum f ) const { Flags g; g.i = i &amp; f; return g; }
    Flags operator~() const { Flags g; g.i = ~i; return g; }

    bool operator!() const { return !i; }

    bool testFlag( Enum f ) const { return i &amp; f; }
};

#define DECLARE_FLAGS(Fl) \
inline Flags&lt;Fl::enum_type&gt; operator|( Fl::enum_type f1, Fl::enum_type f2 ) \
{ return Flags&lt;Fl::enum_type&gt;(f1) | f2; } \
inline Flags&lt;Fl::enum_type&gt; operator|( Fl::enum_type f1, Flags&lt;Fl::enum_type&gt; f2 ) \
{ return f2 | f1; }

typedef Flags&lt;A&gt; AFlags;
typedef Flags&lt;B&gt; BFlags;

DECLARE_FLAGS( AFlags );
DECLARE_FLAGS( BFlags );

int needA( AFlags test )
{
    return test;
}

int needB( BFlags test )
{
    return test;
}

int main()
{
    std::cout &lt;&lt; needA( AFlag1 | AFlag2 ) &lt;&lt; std::endl; // geht
    std::cout &lt;&lt; needB( BFlag1 | BFlag2 ) &lt;&lt; std::endl; // geht
    std::cout &lt;&lt; needA( AFlag1 | BFlag2 ) &lt;&lt; std::endl; // geht nicht
    std::cout &lt;&lt; needB( 3 ) &lt;&lt; std::endl; // geht nicht
}
</code></pre>
<p>&quot;geht nicht&quot; gibts nicht <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>(leichte Abaenderung der Implementation der Qt-Bibliothek, also nicht mein Werk)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1601548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1601548</guid><dc:creator><![CDATA[zwutz]]></dc:creator><pubDate>Mon, 20 Oct 2008 08:48:00 GMT</pubDate></item></channel></rss>