<?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[Teilwort extrahieren]]></title><description><![CDATA[<p>Hi Leute!</p>
<p>Die unten gezeigt Funktion zeigt meinen Versuch ein Teilwort aus einem Bitvector zu extrahieren. Leider funktioniert das so nicht, wie es soll. Ich komme da aber jetzt schon seit Tagen nicht mehr weiter. Die Datenhaltung im Vektor sieht so aus:</p>
<p>Man setzt z.B. diesen BitVector:</p>
<pre><code>0000000101100000
 ^              ^
 |              |
MSB            LSB
</code></pre>
<p>Dann sieht das im char-Array so aus:</p>
<pre><code>|01100000|00000001|
     ^        ^
     |        |
Element 1  Element 2
</code></pre>
<p>Wie kann ich nun auf einfachsten Weg ab einer bestimmten Position 'pos' eine gewisse Länge 'n' an Bits aus dem &quot;großen&quot; BitVector extrahieren und in ein neues Array kopieren?</p>
<p>Ich schaff's einfach nicht. Könnt ihr mir helfen?</p>
<p>PS: Das Problem ist irgendwie die Datenhaltung des arrays. Ich weiß nicht recht von welcher Richtung aus, ich die Position, also 'pos' sehen soll. Irgendwie ist das alles ziemlich doof.</p>
<p>Mein bisheriger Versucht sieht so aus:</p>
<pre><code class="language-cpp">struct bitvector
{
	unsigned char *bits;		//deklaration der Membervariable
};

struct bitvector *createBitVector(struct bitvector *bv, unsigned int anzahl)
{
	int var;

	if(anzahl%8 != 0)
	{
		var = (anzahl / 8) + 1;
	}
	else
	{
		var = anzahl / 8;
	}

	bv-&gt;bits = new unsigned char[var];

	for(int i=0; i&lt;var; i=i+1)		//Array wird standardmäßig auf 0 gesetzt!
	{
		bv-&gt;bits[i] = 0;
	}

return bv;
}

struct bitvector *getSlice(struct bitvector *bv, unsigned int anzahl, unsigned int pos, unsigned int n)
{
	bitvector maske;

	createBitVector(&amp;maske, n);

	pos = pos + 1;		//(pos+1) ist die konvertierung zurück von Index nach &quot;richtiger&quot; Stelle

	bv-&gt;bits[pos/8] = bv-&gt;bits[pos/8] &gt;&gt; (pos - n);
	//maske.bits[i/8] = maske.bits[i/8] | (bv-&gt;bits[i/8] &amp; (1 &gt;&gt; i%8));

	cout &lt;&lt; &quot;verschoben: &quot;;
	printBitVector(bv, anzahl);

	for(unsigned int i=0; i&lt;n; i=i+1)
	{
		maske.bits[i/8] |= (bv-&gt;bits[i/8] &amp; (1 &lt;&lt; i%8));
		//maske.bits[i/8] = bv-&gt;bits[(pos+(i-(pos+n+1)))/8] | ~(maske.bits[(pos+(i-(pos+n+1)))/8]);
	}

	cout &lt;&lt; &quot;extrahierte Bits: &quot;;
	printBitVector(&amp;maske, n);

return bv;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/286413/teilwort-extrahieren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 22:22:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286413.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 May 2011 14:27:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Teilwort extrahieren on Mon, 09 May 2011 14:34:48 GMT]]></title><description><![CDATA[<p>Hi Leute!</p>
<p>Die unten gezeigt Funktion zeigt meinen Versuch ein Teilwort aus einem Bitvector zu extrahieren. Leider funktioniert das so nicht, wie es soll. Ich komme da aber jetzt schon seit Tagen nicht mehr weiter. Die Datenhaltung im Vektor sieht so aus:</p>
<p>Man setzt z.B. diesen BitVector:</p>
<pre><code>0000000101100000
 ^              ^
 |              |
MSB            LSB
</code></pre>
<p>Dann sieht das im char-Array so aus:</p>
<pre><code>|01100000|00000001|
     ^        ^
     |        |
Element 1  Element 2
</code></pre>
<p>Wie kann ich nun auf einfachsten Weg ab einer bestimmten Position 'pos' eine gewisse Länge 'n' an Bits aus dem &quot;großen&quot; BitVector extrahieren und in ein neues Array kopieren?</p>
<p>Ich schaff's einfach nicht. Könnt ihr mir helfen?</p>
<p>PS: Das Problem ist irgendwie die Datenhaltung des arrays. Ich weiß nicht recht von welcher Richtung aus, ich die Position, also 'pos' sehen soll. Irgendwie ist das alles ziemlich doof.</p>
<p>Mein bisheriger Versucht sieht so aus:</p>
<pre><code class="language-cpp">struct bitvector
{
	unsigned char *bits;		//deklaration der Membervariable
};

struct bitvector *createBitVector(struct bitvector *bv, unsigned int anzahl)
{
	int var;

	if(anzahl%8 != 0)
	{
		var = (anzahl / 8) + 1;
	}
	else
	{
		var = anzahl / 8;
	}

	bv-&gt;bits = new unsigned char[var];

	for(int i=0; i&lt;var; i=i+1)		//Array wird standardmäßig auf 0 gesetzt!
	{
		bv-&gt;bits[i] = 0;
	}

return bv;
}

struct bitvector *getSlice(struct bitvector *bv, unsigned int anzahl, unsigned int pos, unsigned int n)
{
	bitvector maske;

	createBitVector(&amp;maske, n);

	pos = pos + 1;		//(pos+1) ist die konvertierung zurück von Index nach &quot;richtiger&quot; Stelle

	bv-&gt;bits[pos/8] = bv-&gt;bits[pos/8] &gt;&gt; (pos - n);
	//maske.bits[i/8] = maske.bits[i/8] | (bv-&gt;bits[i/8] &amp; (1 &gt;&gt; i%8));

	cout &lt;&lt; &quot;verschoben: &quot;;
	printBitVector(bv, anzahl);

	for(unsigned int i=0; i&lt;n; i=i+1)
	{
		maske.bits[i/8] |= (bv-&gt;bits[i/8] &amp; (1 &lt;&lt; i%8));
		//maske.bits[i/8] = bv-&gt;bits[(pos+(i-(pos+n+1)))/8] | ~(maske.bits[(pos+(i-(pos+n+1)))/8]);
	}

	cout &lt;&lt; &quot;extrahierte Bits: &quot;;
	printBitVector(&amp;maske, n);

return bv;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2060889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060889</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Mon, 09 May 2011 14:34:48 GMT</pubDate></item><item><title><![CDATA[Reply to Teilwort extrahieren on Mon, 09 May 2011 14:37:22 GMT]]></title><description><![CDATA[<p>Ist das für dich selbst zum Programmieren lernen oder gibt es einen anderen vernünftigen Grund, warum du nicht so Sachen wie std::bitset oder std:vector benutzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060896</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 09 May 2011 14:37:22 GMT</pubDate></item><item><title><![CDATA[Reply to Teilwort extrahieren on Mon, 09 May 2011 14:38:50 GMT]]></title><description><![CDATA[<p>Nein, wir sollen diese C++ Konstrukte (noch) nicht verwenden. Wir sollen eben bitset usw selbst implementieren. Deswegen der Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060897</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Mon, 09 May 2011 14:38:50 GMT</pubDate></item><item><title><![CDATA[Reply to Teilwort extrahieren on Mon, 09 May 2011 16:20:45 GMT]]></title><description><![CDATA[<p>Damit ich von der etwas dummen Speicherhaltung im array wegkomme, hab ich noch eine for-Schleife eingebaut, die mir die Elemente des Arrays umkopiert.</p>
<pre><code class="language-cpp">struct bitvector *getSlice(struct bitvector *bv, unsigned int anzahl, unsigned int pos, unsigned int n)
{
	bitvector maske, bv_neu;
	char tmp_char;
	int var;

	createBitVector(&amp;bv_neu, anzahl);

	if(anzahl%8 != 0)
	{
		var = (anzahl / 8) + 1;
	}
	else
	{
		var = anzahl / 8;
	}

	for(unsigned int i=0; i&lt;2; i=i+1)		//umkopieren
	{
		tmp_char = bv-&gt;bits[i];
		bv_neu.bits[var-i-1] = tmp_char;
	}

	pos = pos + 1;		//(pos+1) ist die konvertierung zurück von Index nach &quot;richtiger&quot; Stelle

	createBitVector(&amp;maske, n);

	//bv-&gt;bits[pos/8] = bv-&gt;bits[pos/8] &gt;&gt; (pos - n);
	//maske.bits[i/8] = maske.bits[i/8] | (bv-&gt;bits[i/8] &amp; (1 &gt;&gt; i%8));

	for(unsigned int i=0; i&lt;n; i=i+1)
	{
		maske.bits[i/8] = maske.bits[i/8] | (bv_neu-&gt;bits[pos-i/8] &amp; (1 &lt;&lt; i%8));
		//maske.bits[i/8] = bv-&gt;bits[(pos+(i-(pos+n+1)))/8] | ~(maske.bits[(pos+(i-(pos+n+1)))/8]);
	}

	cout &lt;&lt; &quot;extrahierte Bits: &quot;;
	printBitVector(&amp;maske, n);

return bv;
}
</code></pre>
<p>Nach dem umkopieren steht der BitVector nun so im array:</p>
<pre><code>MSB             LSB
  |               |
 |00000001|01100000|
     ^        ^
     |        |
Element 0  Element 1
</code></pre>
<p>Jetzt hab ich aber weiterhin noch das Problem, dass ich nicht weiß wie ich das Teilwort extrahieren soll. Ich denke mal eine Schleife wäre von Vorteil :-). Position kann man ja jetzt von rechts nach links gesehen angeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060932</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Mon, 09 May 2011 16:20:45 GMT</pubDate></item><item><title><![CDATA[Reply to Teilwort extrahieren on Mon, 09 May 2011 16:50:25 GMT]]></title><description><![CDATA[<p>Ich hab nochmal weiter gearbeitet:</p>
<pre><code class="language-cpp">struct bitvector *getSlice(struct bitvector *bv, unsigned int anzahl, unsigned int pos, unsigned int n)
{
	bitvector maske, bv_neu;
	char tmp_char;
	int var;

	createBitVector(&amp;bv_neu, anzahl);

	if(anzahl%8 != 0)
	{
		var = (anzahl / 8) + 1;
	}
	else
	{
		var = anzahl / 8;
	}

	for(unsigned int i=0; i&lt;2; i=i+1)		//umkopieren
	{
		tmp_char = bv-&gt;bits[i];
		bv_neu.bits[var-i-1] = tmp_char;
	}

	pos = pos + 1;		//(pos+1) ist die konvertierung zurück von Index nach &quot;richtiger&quot; Stelle

	createBitVector(&amp;maske, n);

	//bv-&gt;bits[pos/8] = bv-&gt;bits[pos/8] &gt;&gt; (pos - n);
	//maske.bits[i/8] = maske.bits[i/8] | (bv-&gt;bits[i/8] &amp; (1 &gt;&gt; i%8));
	//maske.bits[i/8] = bv-&gt;bits[(pos+(i-(pos+n+1)))/8] | ~(maske.bits[(pos+(i-(pos+n+1)))/8]);

	for(unsigned int i=0; i&lt;n; i=i+1)
	{
		if(((pos-i) % 8) != 0)
		{
			if((pos-i) &gt; 8)
			{
				var = (pos / 8) - 1;
			}
		}
		else
		{
			var =  var + 1;
		}

		maske.bits[i/8] = maske.bits[i/8] | (bv_neu.bits[var] &amp; (1 &lt;&lt; var%8));
	}

	cout &lt;&lt; &quot;extrahierte Bits: &quot;;
	printBitVector(&amp;maske, n);

return bv;
}
</code></pre>
<p>Wenn ich die Funktion jetzt mit der Position 9 und mit der Länge 4 durchlaufen lasse, dann gibt er mir bei diesem BitVector</p>
<pre><code>MSB             LSB
  |               |
 |00000001|01100000|
     ^        ^
     |        |
Element 0  Element 1
</code></pre>
<p>0001 aus.</p>
<p>Ausgeben sollte er aber: 1011.</p>
<p>Ich weiß nicht wo der Fehler ist. Kann mir jemand helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2060939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2060939</guid><dc:creator><![CDATA[vip*r]]></dc:creator><pubDate>Mon, 09 May 2011 16:50:25 GMT</pubDate></item></channel></rss>