<?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[Bitshifting]]></title><description><![CDATA[<p>Hi,</p>
<p>ich muss für ne uni abgabe ein 16bit bitmap file manipulieren. Ich hab die Pixeldaten in ein char* array geladen. Jeweils 2 hintereinanderliegende bytes enthalten die 3 farbwerte für einen pixel, also 3 x 5 Bits (wobei das letzte glaub ich ein padding bit enthält um auf 16 bit zu kommen).</p>
<p>Die einzige Möglichkeit die mir einfällt, um jeweils 5 bits im Buffer zu schreiben ist Bitshifting, leider hab ich damit keine Erfahrung.</p>
<p>Kann mir vielleicht jemand nen Tip geben, wie man sowas macht ?</p>
<p>Vielen Dank !</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/239890/bitshifting</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 07:06:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/239890.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 29 Apr 2009 09:24:47 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bitshifting on Wed, 29 Apr 2009 09:24:47 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich muss für ne uni abgabe ein 16bit bitmap file manipulieren. Ich hab die Pixeldaten in ein char* array geladen. Jeweils 2 hintereinanderliegende bytes enthalten die 3 farbwerte für einen pixel, also 3 x 5 Bits (wobei das letzte glaub ich ein padding bit enthält um auf 16 bit zu kommen).</p>
<p>Die einzige Möglichkeit die mir einfällt, um jeweils 5 bits im Buffer zu schreiben ist Bitshifting, leider hab ich damit keine Erfahrung.</p>
<p>Kann mir vielleicht jemand nen Tip geben, wie man sowas macht ?</p>
<p>Vielen Dank !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703023</guid><dc:creator><![CDATA[pulse00]]></dc:creator><pubDate>Wed, 29 Apr 2009 09:24:47 GMT</pubDate></item><item><title><![CDATA[Reply to Bitshifting on Wed, 29 Apr 2009 10:20:32 GMT]]></title><description><![CDATA[<p>Ich würde je 2 array Elemente in einen 2 Byte Datentyp casten (z.B. short) bzw das ganze array in ein short array.</p>
<pre><code class="language-cpp">char* array = ...
short* bits = reinterpret_cast&lt;short*&gt;(array);
for(size_t i=0;i&lt;pixelCount;++i)
{
  char component_1 = bits[i] &amp; 0x001F;       // untere 5 bit
  char component_2 = (bits[i] &amp; 0x03E0)&gt;&gt;5;  // mittlere 5 bit
  char component_3 = (bits[i] &amp; 0x7C00)&gt;&gt;10; // obere 5 bit
}
</code></pre>
<p>Ungetestet <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/1703037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703037</guid><dc:creator><![CDATA[ihoernchen]]></dc:creator><pubDate>Wed, 29 Apr 2009 10:20:32 GMT</pubDate></item><item><title><![CDATA[Reply to Bitshifting on Wed, 29 Apr 2009 10:45:26 GMT]]></title><description><![CDATA[<p>Bist du sicher, das da ein Paddingbit enthalten ist?<br />
Imho werden für rot und blau jeweils 5 bit verwendet, für grün 6 bit da das Auge für grün am empfindlichsten ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703050</guid><dc:creator><![CDATA[anonymus]]></dc:creator><pubDate>Wed, 29 Apr 2009 10:45:26 GMT</pubDate></item><item><title><![CDATA[Reply to Bitshifting on Wed, 29 Apr 2009 11:14:53 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4188">@anonymus</a></p>
<p>Ich hab mich damit noch nicht im detail auseinandergesetzt, da ich erstmal die hürde mit der bitmanipulation schaffen möchte. Laut unserer Angabe ist aber das 6. bit beim blauwert einfach nur ein padding bit und wird nicht verwendet.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/17844">@ihoernchen</a></p>
<p>danke für den tip. Ich hab versucht die einzelnen komponenten so zu manipulieren</p>
<pre><code class="language-cpp">component_1 = 0xff&gt;&gt;3;
component_2 = 0x00&gt;&gt;3;
component_3 = 0x00&gt;&gt;3;
</code></pre>
<p>Wenn ich mir die 3 variablen im debugger in binärform anschaue steht die erste auf 11111 und die beiden anderen auf 0. Wenn ich das mit dem shiften richtig verstanden habe müsste das passen.</p>
<p>Leider krieg ich das schreiben der 3 werte in das short array nicht hin, hier mein Versuch:</p>
<pre><code class="language-cpp">testData[0] = component_1 &amp; 0x001F;
testData[0] = (component_2 &amp; 0x03E0)&gt;&gt;5;
testData[0] = (component_2 &amp; 0x7C00)&gt;&gt;10;
</code></pre>
<p>Das scheint aber nicht zu funktionieren, zumindest krieg ich immer nen schwarzen Pixel. Eigentlich sollte er ja rot sein. Zumindest manipuliere ich nur einen Pixel, also das müsste schon mal passen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1703068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703068</guid><dc:creator><![CDATA[pulse00]]></dc:creator><pubDate>Wed, 29 Apr 2009 11:14:53 GMT</pubDate></item><item><title><![CDATA[Reply to Bitshifting on Wed, 29 Apr 2009 11:46:39 GMT]]></title><description><![CDATA[<p>pulse00 schrieb:</p>
<blockquote>
<p>Ich hab versucht die einzelnen komponenten so zu manipulieren</p>
<pre><code class="language-cpp">component_1 = 0xff&gt;&gt;3;
component_2 = 0x00&gt;&gt;3;
component_3 = 0x00&gt;&gt;3;
</code></pre>
<p>Wenn ich mir die 3 variablen im debugger in binärform anschaue steht die erste auf 11111 und die beiden anderen auf 0. Wenn ich das mit dem shiften richtig verstanden habe müsste das passen.</p>
</blockquote>
<p>Mit dem Shift Operator schiebst du die Bits um X Positionen nach Links oder Rechts.</p>
<pre><code class="language-cpp">char c = 0x01; // binär 0000 0001
char s = c &lt;&lt; 1; // schiebe alle bits von c um 1 nach links
// s = 0000 0010
s = c &gt;&gt; 1; // schiebe alle bits von c um 1 nach rechts
// s = 0000 0000, das bit ganz rechts wird &quot;raus-geshiftet&quot;

c = 0x10; // 0001 0000
s = c &lt;&lt; 1;
// s = 0010 0000

s = c &gt;&gt; 1;
// s = 0000 1000
</code></pre>
<p>pulse00 schrieb:</p>
<blockquote>
<p>Leider krieg ich das schreiben der 3 werte in das short array nicht hin, hier mein Versuch:</p>
<pre><code class="language-cpp">testData[0] = component_1 &amp; 0x001F;
testData[0] = (component_2 &amp; 0x03E0)&gt;&gt;5;
testData[0] = (component_2 &amp; 0x7C00)&gt;&gt;10;
</code></pre>
<p>Das scheint aber nicht zu funktionieren, zumindest krieg ich immer nen schwarzen Pixel. Eigentlich sollte er ja rot sein. Zumindest manipuliere ich nur einen Pixel, also das müsste schon mal passen <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>
</blockquote>
<p>Ich meinte nicht, dass du die in das short array schreiben sollst. Sondern von da holen. Das sollte nur das spätere bearbeiten vereinfachen. Einfach, weil du 2 byte pro pixel hast und nicht einen.</p>
<p>Was du da in dem Beispiel machst verstehe ich nicht.<br />
Mein Beispiel oben soll, sofern es richtig ist, die 3 5-Bit Farbwerte aus deinem array extrahieren.<br />
Was hast du denn vor...?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703086</guid><dc:creator><![CDATA[ihoernchen]]></dc:creator><pubDate>Wed, 29 Apr 2009 11:46:39 GMT</pubDate></item><item><title><![CDATA[Reply to Bitshifting on Wed, 29 Apr 2009 12:08:32 GMT]]></title><description><![CDATA[<p>ich muss die 3 Farbwerte extrahieren, verändern, und dann wieder in das short* array schreiben.</p>
<p>Hier meine Pixel Klasse:</p>
<pre><code class="language-cpp">CPixelFormat_16::CPixelFormat_16(BITMAP_HEADER &amp;header, char* data) {

  m_header = header;
  testData = reinterpret_cast&lt;short*&gt;(data); // -&gt; testdata ist so definiert: short* testData

}
</code></pre>
<p>in der klasse habe ich eine methode um einem einzelnen Pixel einen Farbwert zuzuweisen. So wie ich das verstanden hab muss ich erst aus dem short array ein short holen und mit bitshifting den 3 chars zuweisen:</p>
<pre><code class="language-cpp">char component_1 = testData[pixel] &amp; 0x001F;
char component_2 = (testData[pixel] &amp; 0x03E0)&gt;&gt;5;
char component_3 = (testData[pixel] &amp; 0x7C00)&gt;&gt;10;
</code></pre>
<p>Hier greife ich ja immer auf das gleiche short zu (1 pixel), und shifte nur die bits so, damit ich die entsprechenden farbwerte extrahiere.</p>
<p>Danach manipuliere ich die 3 einzelnen werte:</p>
<pre><code class="language-cpp">component_1 = 0xff&gt;&gt;3;
component_2 = 0x00&gt;&gt;3;
component_3 = 0x00&gt;&gt;3;
</code></pre>
<p>Das &gt;&gt; 3 verwende ich, weil ein char ja 8 bit hat und ich aber nur 5 verwenden kann... Bin mir nicht sicher ob das so funktioniert.</p>
<p>Wenn das erledigt ist, muss ich die 3 chars irgendwie wieder in das pixel (ein element im short array) schreiben:</p>
<pre><code class="language-cpp">testData[pixel] = component_1 &amp; 0x001F;
testData[pixel] = (component_2 &amp; 0x03E0)&gt;&gt;5;
testData[pixel] = (component_2 &amp; 0x7C00)&gt;&gt;10;
</code></pre>
<p>Wie ich das mache scheint aber offenbar ein Blödsinn zu sein. Mir ist nur nicht ganz klar, wie ich die 3 chars wieder in ein short zurückcasten kann um es dann ins array zu schreiben...</p>
<p>Um das ganze zusammenzufassen:</p>
<p>1. Ich caste das char* array in ein short* array, somit habe ich in einem short 16 bits -&gt; 3 farbwerte -&gt; 1 pixel.<br />
2. Aus dem short Wert hol ich mir per bitshifting die einzelnen farbwerte (2x5 + 1x6 bits)<br />
3. Farbwerte manipulieren<br />
4. Die 3 Farbwerte wieder in einem short unterbringen, um sie im pixelArray schreiben zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703101</guid><dc:creator><![CDATA[pulse00]]></dc:creator><pubDate>Wed, 29 Apr 2009 12:08:32 GMT</pubDate></item><item><title><![CDATA[Reply to Bitshifting on Wed, 29 Apr 2009 12:25:36 GMT]]></title><description><![CDATA[<p>Du musst die Bits an die richtige Position shiften und mit Bitweisem-Oder (|) verknüpfen.</p>
<pre><code class="language-cpp">bits[i] = (component_3&lt;&lt;10) | (component_2&lt;&lt;5) | component_1;

Da component ein char ist es möglich, dass die Bits rausgeshiftet werden.
bits[i] = (((short)component_3)&lt;&lt;10) | (((short)component_2)&lt;&lt;5) | component_1;
Sollte klappen. Oder vielleicht sind einzel Schritte besser.
</code></pre>
<p>Bedeutet: nimm component_3, schiebe die Bits 10 Positionen nach links. Bitweise verknüpfen (|) mit component_1 und component_2.</p>
<p>Schau dir am besten mal ein Tutorial zu dem Bitshift kram an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703122</guid><dc:creator><![CDATA[ihoernchen]]></dc:creator><pubDate>Wed, 29 Apr 2009 12:25:36 GMT</pubDate></item><item><title><![CDATA[Reply to Bitshifting on Wed, 29 Apr 2009 12:31:26 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">unsigned short farbe;
unsigend char b=farbe;
unsigend char g=farbe&gt;&gt;5;
unsigend char r=farbe&gt;&gt;11;
//hier manipulieren, dabei immer den maximalwert im auge behalten
farbe=b|(g&lt;&lt;5)|(r&lt;&lt;11);
</code></pre>
<p>Das hier sollte eigentlich hinkommen für das was du da willst, zum Glück gibts 32bit Farben, die sind einfacher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703129</guid><dc:creator><![CDATA[Xebov]]></dc:creator><pubDate>Wed, 29 Apr 2009 12:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to Bitshifting on Wed, 29 Apr 2009 12:34:51 GMT]]></title><description><![CDATA[<p>das mit dem bitweise verknüpfen war der springende Punkt, danke Dir.</p>
<p>Werd mir ein tutorial ansehen um das ganze auch wirklich zu verstehen. Danke vielmals für die Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1703132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1703132</guid><dc:creator><![CDATA[pulse00]]></dc:creator><pubDate>Wed, 29 Apr 2009 12:34:51 GMT</pubDate></item></channel></rss>