<?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[Konzeptionsfrage zu Bitsetähnlichem Typ]]></title><description><![CDATA[<p>Hey Leute,<br />
ich wollte als Übung den Datentyp &quot;Bitset&quot; aus der STL nachprogrammieren.<br />
Das Konzept sieht in etwa so aus:</p>
<pre><code class="language-cpp">template&lt;size_t N&gt;
class mein_bitset
{
    //array allokieren, das mindestens N bits halten kann
    size_t bits[ N/(sizeof(size_t)*CHAR_BIT) + (N%CHAR_BIT) ? 1 : 0 ];
};
</code></pre>
<p>Auf einzelne Bits zuzugreifen und Operatoren zu überladen wie ODER oder UND sind kein Problem. Allerdings habe ich Probleme, den Shift Operator effizient zu implementieren.<br />
Theoretisch könnte man ja ein temporäres Array erstellen, und dann bit für bit dieses nach dem Vorbild des Originalen (je nachdem, wie geshiftet wird) bestücken. Ich frage mich aber, ob das nicht irgendwie performanter geht.<br />
Mein erster Gedanke war memmove, allerdings würde das ja leicht die array-grenzen überschreiben. Zudem können ja nur bytes verschoben werden. Dadurch könnte ein Shift um 1 nicht realisiert werden.<br />
Mein nächster Gedanke war es, &quot;Pufferbytes&quot; einzufügen.</p>
<pre><code class="language-cpp">class mein_bitset
{
    //Ein Puffer-size_t am Anfang, eins am Ende
    size_t bits[ N/(sizeof(size_t)*CHAR_BIT) + (N%CHAR_BIT) ? 3 : 2 ];
    size_t start;
    size_t end;
};
</code></pre>
<p>Hier vergrößere ich das Array um 2 size_t's. Der Sinn ist Folgender: Sollte das Bitset um eins nach links geshiftet werden, &quot;zeigt&quot; start nicht mehr auf das erste Bit vom 2. size_t, sondern auf das letzte bit des ersten (Puffer-)size_t's. Das ganze ist dann aber deutlich aufwändiger zu implementieren.</p>
<p>Wie würdet ihr so ein Problem lösen? Gibt es einen anderen Weg, den Shift Operator performant zu implementieren? Ich freue mich über alle Anregungen <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/topic/256241/konzeptionsfrage-zu-bitsetähnlichem-typ</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 10:29:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/256241.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 Dec 2009 00:03:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konzeptionsfrage zu Bitsetähnlichem Typ on Thu, 10 Dec 2009 00:03:06 GMT]]></title><description><![CDATA[<p>Hey Leute,<br />
ich wollte als Übung den Datentyp &quot;Bitset&quot; aus der STL nachprogrammieren.<br />
Das Konzept sieht in etwa so aus:</p>
<pre><code class="language-cpp">template&lt;size_t N&gt;
class mein_bitset
{
    //array allokieren, das mindestens N bits halten kann
    size_t bits[ N/(sizeof(size_t)*CHAR_BIT) + (N%CHAR_BIT) ? 1 : 0 ];
};
</code></pre>
<p>Auf einzelne Bits zuzugreifen und Operatoren zu überladen wie ODER oder UND sind kein Problem. Allerdings habe ich Probleme, den Shift Operator effizient zu implementieren.<br />
Theoretisch könnte man ja ein temporäres Array erstellen, und dann bit für bit dieses nach dem Vorbild des Originalen (je nachdem, wie geshiftet wird) bestücken. Ich frage mich aber, ob das nicht irgendwie performanter geht.<br />
Mein erster Gedanke war memmove, allerdings würde das ja leicht die array-grenzen überschreiben. Zudem können ja nur bytes verschoben werden. Dadurch könnte ein Shift um 1 nicht realisiert werden.<br />
Mein nächster Gedanke war es, &quot;Pufferbytes&quot; einzufügen.</p>
<pre><code class="language-cpp">class mein_bitset
{
    //Ein Puffer-size_t am Anfang, eins am Ende
    size_t bits[ N/(sizeof(size_t)*CHAR_BIT) + (N%CHAR_BIT) ? 3 : 2 ];
    size_t start;
    size_t end;
};
</code></pre>
<p>Hier vergrößere ich das Array um 2 size_t's. Der Sinn ist Folgender: Sollte das Bitset um eins nach links geshiftet werden, &quot;zeigt&quot; start nicht mehr auf das erste Bit vom 2. size_t, sondern auf das letzte bit des ersten (Puffer-)size_t's. Das ganze ist dann aber deutlich aufwändiger zu implementieren.</p>
<p>Wie würdet ihr so ein Problem lösen? Gibt es einen anderen Weg, den Shift Operator performant zu implementieren? Ich freue mich über alle Anregungen <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/1820380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1820380</guid><dc:creator><![CDATA[Malcolm85]]></dc:creator><pubDate>Thu, 10 Dec 2009 00:03:06 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptionsfrage zu Bitsetähnlichem Typ on Thu, 10 Dec 2009 22:20:29 GMT]]></title><description><![CDATA[<p>Habs jetzt nicht überprüft, sollte aber klappen:</p>
<pre><code class="language-cpp">template &lt;int N&gt;
mein_bitset&lt;N&gt; mein_bitset&lt;N&gt;::left_shift(unsigned int shifts) const
{
  const static int array_size = N/(sizeof(size_t)*CHAR_BIT) + (N%CHAR_BIT) ? 1 : 0; //gehoert eigentlich in die Klasse...
  const int overlap = sizeof(size_t)*CHAR_BIT - shifts;
  mein_bitset&lt;N&gt; tmp;
  for (size_t i = 0; i &lt; array_size-1; ++i)
  {
    tmp.bits[i] = bits[i] &lt;&lt; shifts + bits[i+1] &gt;&gt; overlap;
  }
  tmp.bits[array_size-1] = bits[array_size-1] &lt;&lt; shifts;

  return tmp;
}

template &lt;int N&gt;
mein_bitset&lt;N&gt; operator&lt;&lt; (mein_bitset&lt;N&gt; const&amp; lhs, unsigned int rhs)
{
  return lhs.left_shift(rhs);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1820405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1820405</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 10 Dec 2009 22:20:29 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptionsfrage zu Bitsetähnlichem Typ on Thu, 10 Dec 2009 20:35:00 GMT]]></title><description><![CDATA[<p>Perfekt! Nach Genau so etwas hatte ich gesucht. Danke <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1820941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1820941</guid><dc:creator><![CDATA[Malcolm85]]></dc:creator><pubDate>Thu, 10 Dec 2009 20:35:00 GMT</pubDate></item></channel></rss>