<?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[Pointer modulo rechnen]]></title><description><![CDATA[<p>Hallo!</p>
<p>Für eine Hash-Funktion möchte ich die letzten paar Stellen eines Pointers in einen unsigned int legen. Das hier geht aber nicht:</p>
<pre><code>unsigned adr1=p % hashTableLength;
</code></pre>
<p>..wobei hashTableLength irgendwas kleines, 1024 oder so, ist. Weiß jemand, wie man das syntaktisch korrekt und portabel löst?</p>
<p>Danke, lg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279738/pointer-modulo-rechnen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 10:10:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279738.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Jan 2011 08:05:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer modulo rechnen on Mon, 03 Jan 2011 08:05:27 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Für eine Hash-Funktion möchte ich die letzten paar Stellen eines Pointers in einen unsigned int legen. Das hier geht aber nicht:</p>
<pre><code>unsigned adr1=p % hashTableLength;
</code></pre>
<p>..wobei hashTableLength irgendwas kleines, 1024 oder so, ist. Weiß jemand, wie man das syntaktisch korrekt und portabel löst?</p>
<p>Danke, lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001539</guid><dc:creator><![CDATA[argc]]></dc:creator><pubDate>Mon, 03 Jan 2011 08:05:27 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer modulo rechnen on Mon, 03 Jan 2011 08:10:26 GMT]]></title><description><![CDATA[<p>portabel wird es so nicht, aber was spricht gegen einen index?</p>
<pre><code>unsigned adr1=&amp;p[i % hashTableLength];
</code></pre>
<p>der compiler sollte daraus schon was optimales zaubern, was in maschinencode deiner ideee entspricht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001540</guid><dc:creator><![CDATA[ppptr]]></dc:creator><pubDate>Mon, 03 Jan 2011 08:10:26 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer modulo rechnen on Mon, 03 Jan 2011 09:06:09 GMT]]></title><description><![CDATA[<p>Dies hier müsste vollkommen portabel sein:</p>
<pre><code class="language-cpp">unsigned int adr1 = * reinterpret_cast&lt;unsigned int*&gt;(reinterpret_cast&lt;char*&gt;(p+1)-sizeof(adr1));
</code></pre>
<p>edit: Wohlgemerkt dient obiger Code dazu, die letzten paar Stellen eines Pointers in einen unsigned int zu packen. Das modulo musst du noch hinzufügen.</p>
<p>edit2: 100% portabel ist es doch nicht, wenn ich länger darüber nachdenke: Sollte sizeof(unsigned int) &gt; sizeof(void <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="😉"
    /> sein (sehr ungewöhnlich aber möglich!) hätte man ein Problem. Könnte man natürlich noch abfangen - lohnt aber wohl den Aufwand nicht, weil rein hypothetisch. Der Code funktioniert jedenfalls für alle gängigen Pointer und Integergrößen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001545</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 03 Jan 2011 09:06:09 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer modulo rechnen on Mon, 03 Jan 2011 08:35:41 GMT]]></title><description><![CDATA[<p>argc schrieb:</p>
<blockquote>
<p>Für eine Hash-Funktion möchte ich die letzten paar Stellen eines Pointers in einen unsigned int legen. Das hier geht aber nicht:</p>
<pre><code>unsigned adr1=p % hashTableLength;
</code></pre>
<p>..wobei hashTableLength irgendwas kleines, 1024 oder so, ist. Weiß jemand, wie man das syntaktisch korrekt und portabel löst?</p>
</blockquote>
<p>Unter der Annahme, dass sizeof(unsigned long)==sizeof(void*) gilt, sollte das hier funktionieren:</p>
<pre><code class="language-cpp">unsigned adr1= reinterpret_cast&lt;unsigned long&gt;(p) % hashTableLength;
</code></pre>
<p>Es gibt auch oft ein typedef für einen solchen Ganzzahtyp, uintptr_t, aber der ist noch nicht offiziell im C++ Standard zu finden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2001546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2001546</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 03 Jan 2011 08:35:41 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer modulo rechnen on Tue, 04 Jan 2011 02:15:50 GMT]]></title><description><![CDATA[<p>Naja es gibt noch <code>ptrdiff_t</code> und <code>size_t</code> .<br />
Die reichen bloss u.U. leider beide nicht auf Systemen mit segmentiertem Speicher.<br />
Pointer -&gt; Hash is doof^4 wenn man es wirklich 100% plattformunabhängig haben will.<br />
(Und nocht mit Compilern ohne std::hash arbeiten muss, und auch boost::hash nicht verwenden will/kann)</p>
<p>Wenn man sich auf &quot;flat memory&quot; Systeme beschränkt geht die Variante von krümelkacker.</p>
<p>Ansonsten könnte man noch sowas probieren:</p>
<pre><code class="language-cpp">size_t PointerToHash(void const* ptr)
{
    size_t hash = 0;
    unsigned char const* p = reinterpret_cast&lt;unsigned char const*&gt;(&amp;ptr);
    for (size_t i = 0; i &lt; sizeof(void const*); i++)
    {
        hash *= speziell_super_wichtig_ausgesuchter_multiplikator_für_guten_hash;
        hash ^= p[i];
    }
    return hash;
}
</code></pre>
<p>Das verlässt sich allerdings darauf dass die binäre Zeiger-Darstellung &quot;Alias-frei&quot; ist, also keine zwei unterschiedlichen Bitmuster für die selbe Adresse stehen können.<br />
Ich weiss nicht ob das laut C++ Standard erlaubt ist, aber ich schätze eher schon.<br />
Also auch doof.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002043</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 04 Jan 2011 02:15:50 GMT</pubDate></item></channel></rss>