<?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[Frage zu Bitwise Operationen und Grundrechenarten]]></title><description><![CDATA[<p>Hallo,<br />
ich beschäftige mich gerade mit den Bitwise Operatoren (in C++) und wie man damit die Grundrechenarten nachstellen kann.<br />
Gegeben ist ein Bitset, welches eine unsigned Ganzzahl repräsentiert.<br />
Mit Shift Operatoren kann man ja Multiplikation und Division mit 2^n realisieren.<br />
Bei Wikipedia habe ich das gefunden (Pseudocode):</p>
<pre><code>c := 0
while b != 0
    if (b and 1) != 0
        c := c + a
    shift a left by one
    shift b right by one

return c
</code></pre>
<p>Hier wird Über Addition und Bitshift Multiplikation mit beliebigen Zahlen realisiert. Allerdings ist dabei ja immernoch die &quot;normale&quot; Addition erforderlich.<br />
Kann man Addition und Subtraktion auch ausschließlich über die Bitwise Operatoren realisieren? (Division ist nicht so wichtig)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/250715/frage-zu-bitwise-operationen-und-grundrechenarten</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 21:47:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/250715.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 Sep 2009 22:59:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Bitwise Operationen und Grundrechenarten on Tue, 22 Sep 2009 22:59:30 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich beschäftige mich gerade mit den Bitwise Operatoren (in C++) und wie man damit die Grundrechenarten nachstellen kann.<br />
Gegeben ist ein Bitset, welches eine unsigned Ganzzahl repräsentiert.<br />
Mit Shift Operatoren kann man ja Multiplikation und Division mit 2^n realisieren.<br />
Bei Wikipedia habe ich das gefunden (Pseudocode):</p>
<pre><code>c := 0
while b != 0
    if (b and 1) != 0
        c := c + a
    shift a left by one
    shift b right by one

return c
</code></pre>
<p>Hier wird Über Addition und Bitshift Multiplikation mit beliebigen Zahlen realisiert. Allerdings ist dabei ja immernoch die &quot;normale&quot; Addition erforderlich.<br />
Kann man Addition und Subtraktion auch ausschließlich über die Bitwise Operatoren realisieren? (Division ist nicht so wichtig)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1782837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782837</guid><dc:creator><![CDATA[Gilder]]></dc:creator><pubDate>Tue, 22 Sep 2009 22:59:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Bitwise Operationen und Grundrechenarten on Wed, 23 Sep 2009 01:29:58 GMT]]></title><description><![CDATA[<p>So, ich habe jetzt Multiplikation und Addition implementiert:</p>
<pre><code class="language-cpp">const size_t FELDLAENGE = 255u; //zB

class bit
{
   private:
    std::bitset&lt;FELDLAENGE&gt; a;

   public:
    bit&amp; operator+=(const bit&amp; b)
    {
        std::bitset&lt;FELDLAENGE&gt; sum   = a ^ b.a;
        std::bitset&lt;FELDLAENGE&gt; carry = a &amp; b.a;

        while (carry.any())  // != 0
        {
            carry &lt;&lt;= 1u;
            a = sum;
            sum = a ^ carry;
            carry = a &amp; carry;
        }

        a=sum;
        return *this;
    }

    bit&amp; operator*=(const bit&amp; b)
    {
        std::bitset&lt;FELDLAENGE&gt; one = 1u; //geht das eleganter?

        bit copy, p;
        copy.a = b.a;

        for(; a!=0; a&gt;&gt;=1u, copy.a&lt;&lt;=1u)
            if((a&amp;one).any())
                p+=copy;
        a=p.a;

        return *this;
    }
};
</code></pre>
<p>Das funktioniert auch ziemlich gut. Hat jemand eine Idee zum Algorithmus für die Subtraktion? Gibt es Verbesserungen an den beiden Algorithmen? Oder am Klassendesign ? Außerdem gefällt mir der Umweg über das bitset &quot;one&quot; nicht (Zeile 28).Gibt es Alternativen?</p>
<p>Schonmal Danke für alle Anregungen <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>BTW: Die Performance ist zweitrangig. Es sollte sich möglichst so wie die PODs verhalten, die drei Grundrechenarten unterstützen und möglichst portabel sein <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/1782842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782842</guid><dc:creator><![CDATA[Gilder]]></dc:creator><pubDate>Wed, 23 Sep 2009 01:29:58 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Bitwise Operationen und Grundrechenarten on Wed, 23 Sep 2009 01:45:51 GMT]]></title><description><![CDATA[<p>Gilder schrieb:</p>
<blockquote>
<p>Hat jemand eine Idee zum Algorithmus für die Subtraktion?</p>
</blockquote>
<p>Das Zweierkomplement vom Subtrahent bilden und dann einfach draufaddieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1782843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782843</guid><dc:creator><![CDATA[Tobiking2]]></dc:creator><pubDate>Wed, 23 Sep 2009 01:45:51 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Bitwise Operationen und Grundrechenarten on Wed, 23 Sep 2009 09:39:30 GMT]]></title><description><![CDATA[<p>Gilder schrieb:</p>
<blockquote>
<p>Außerdem gefällt mir der Umweg über das bitset &quot;one&quot; nicht (Zeile 28).Gibt es Alternativen?</p>
</blockquote>
<p>a.test(1)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1782948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1782948</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 23 Sep 2009 09:39:30 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Bitwise Operationen und Grundrechenarten on Wed, 23 Sep 2009 23:26:22 GMT]]></title><description><![CDATA[<p>Super. Das funktioniert einwandfrei <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>Trotzdem habe ich noch einige Fragen zu den bitsets <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>
<p>Sind Bitsets unabhängig von der Endianness? Ich vermute mal ja. Also greift zB [0] immer auf das ganz &quot;rechte&quot; Bit zu oder auf das am wenigst wertige Bit zu?</p>
<p>Wie initialisiere ich am besten ein bitset mit eins?</p>
<pre><code class="language-cpp">//Variante 1: Standardkonstruktor und Indexoperator
bitset&lt;50&gt; eins; eins[0]=1;

//Variante 2: Zuweisen eines POD's.
bitset&lt;50&gt; zwei = 1; //Was ist, wenn die POD variable weniger bits hat als das Bitset?

//Variante 3: Initialisierung über string
bitset&lt;50&gt; drei = string(&quot;1&quot;); //wieder unabhängig von Endianness? Und weniger &quot;Zeichen&quot; als Bits. Problemlos?
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1783350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1783350</guid><dc:creator><![CDATA[Gilder]]></dc:creator><pubDate>Wed, 23 Sep 2009 23:26:22 GMT</pubDate></item></channel></rss>