<?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[Verständnisprobelm]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich hab in einem Tutorial in dem es darum geht Infos einer Windows Bitmap datei zu entnehmen eine funktion gefunden die wie folgt lautet:</p>
<pre><code class="language-cpp">int toInt(const char* bytes) {
		return (int)(((unsigned char)bytes[3] &lt;&lt; 24) |
					 ((unsigned char)bytes[2] &lt;&lt; 16) |
					 ((unsigned char)bytes[1] &lt;&lt; 8) |
					 (unsigned char)bytes[0]);
}
</code></pre>
<p>Das die Funktion aus den 4 eingelesenen Chars die die Größer der Bitmap darstellen sollen ein Integer macht der dann der Größe in Byte entspricht is mir soweit klar. Was ich auch soweit verstanden hab is das die 8,16 und die 24 die jeweiligen chars an die richtige posizion verscheiben. Nur versteh ich nicht ganz wie ich ein char um 8,16 oder 24 stellen verscheiben kann ohne das was dabei verlohren geht. Ich glaub mein Problem liegt darin das ich nicht genau weis was dort intern vorgeht und in welcher reihenfolge das abläuft.<br />
Ich hoffe ihr könnt mir helfen das zu verstehen. <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>edit: wie wird ein unsigned char gegenüber einem normalen char von den bitoperatoen behandelt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/186364/verständnisprobelm</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 08:51:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/186364.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 08 Jul 2007 00:18:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnisprobelm on Sun, 08 Jul 2007 00:21:29 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich hab in einem Tutorial in dem es darum geht Infos einer Windows Bitmap datei zu entnehmen eine funktion gefunden die wie folgt lautet:</p>
<pre><code class="language-cpp">int toInt(const char* bytes) {
		return (int)(((unsigned char)bytes[3] &lt;&lt; 24) |
					 ((unsigned char)bytes[2] &lt;&lt; 16) |
					 ((unsigned char)bytes[1] &lt;&lt; 8) |
					 (unsigned char)bytes[0]);
}
</code></pre>
<p>Das die Funktion aus den 4 eingelesenen Chars die die Größer der Bitmap darstellen sollen ein Integer macht der dann der Größe in Byte entspricht is mir soweit klar. Was ich auch soweit verstanden hab is das die 8,16 und die 24 die jeweiligen chars an die richtige posizion verscheiben. Nur versteh ich nicht ganz wie ich ein char um 8,16 oder 24 stellen verscheiben kann ohne das was dabei verlohren geht. Ich glaub mein Problem liegt darin das ich nicht genau weis was dort intern vorgeht und in welcher reihenfolge das abläuft.<br />
Ich hoffe ihr könnt mir helfen das zu verstehen. <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>edit: wie wird ein unsigned char gegenüber einem normalen char von den bitoperatoen behandelt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320487</guid><dc:creator><![CDATA[Yumori]]></dc:creator><pubDate>Sun, 08 Jul 2007 00:21:29 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisprobelm on Sun, 08 Jul 2007 07:56:17 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Der links-Shift Operator verschiebt dein char für dich und wenn du nicht zu weit schiebst geht auch nichts verloren.</p>
<p><strong>Lektion 1, Shiften</strong></p>
<p>Hier wird die Bitfolge um ein Bit nach links geschoben:</p>
<pre><code>00000001 &lt;&lt; 1 
00000010
</code></pre>
<p>Bitfolge um zwei Bit nach links schieben:</p>
<pre><code>00000001 &lt;&lt; 2
00000100
</code></pre>
<p>142<br />
Wenn du jetzt aber zu weit schiebst geht alles was links rausgeschoben wird verloren:</p>
<pre><code>00000001 &lt;&lt; 8
00000000
</code></pre>
<p>Das bedeutet die Bits rotieren nicht, sondern werden nach links aus der Bitstruktur geschoben. in dem Fall brauchst du einen größeren Datentyp um verluste zu vermeiden.</p>
<p><strong>Lektion 2, Bitweises ODER</strong></p>
<p>Wenn zwei Bits per Bitweisem ODER (|) verknüpft werden hat das folgende Auswirkung:</p>
<pre><code>0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
</code></pre>
<p>Der ODER Operator achtet also darauf das mindestens ein Bit gesetzt wurde. Ist dies der Fall ist das resultierende Bit ebenfalls gesetzt (1).</p>
<p>Ein &quot;komplexeres&quot; Beispiel:</p>
<pre><code>001010111100010 |
001101001000110
---------------
001111111100110
</code></pre>
<p><strong>Lektion 3, aus 4 Bytes 1 Integer</strong></p>
<p>Angenommen (ist bei dir wahrscheinlich so) dein <em>char</em> hat 8 Bit und dein <em>int</em> 32. Dann passen in dein <em>int</em> genau 4 <em>chars</em> (32/8=4). Diese 4 char Werte hast du ja bereits, nun musst du sie nurnoch so aneinanderreihen das sie deine 32 Bit (für den integer) füllen.</p>
<p>Angenommen du hast deine 4 Bytes haben folgende Werte:</p>
<pre><code>bytes[ 0 ] = 184 =&gt; 10111000b
bytes[ 1 ] = 157 =&gt; 10011101b
bytes[ 2 ] = 240 =&gt; 11110000b
bytes[ 3 ] = 142 =&gt; 10001110b
</code></pre>
<p>Dann musst du diese Werte einfach aneinanderreihen:</p>
<pre><code>00000000 00000000 00000000 10001110 &lt;&lt; 24
10001110 00000000 00000000 00000000
</code></pre>
<pre><code>00000000 00000000 00000000 11110000 &lt;&lt; 16
00000000 11110000 00000000 00000000
</code></pre>
<pre><code>00000000 00000000 00000000 10011101 &lt;&lt; 8
00000000 00000000 10011101 00000000
</code></pre>
<pre><code>00000000 00000000 00000000 10111000
</code></pre>
<p>Nachdem du die Bitfolgen neu positioniert hast kannst du alle per logischen UND verknüpfen. Da bei jeder Bitfolge nur ein Oktett gesetzt ist, welches bei allen anderen NICHT gesetzt ist verändert sich an den einzelnen Oktetten nichts.</p>
<pre><code>10111000 00000000 00000000 00000000
00000000 11110000 00000000 00000000
00000000 00000000 10011101 00000000
00000000 00000000 00000000 10111000 |
-----------------------------------
10001110 11110000 10011101 10111000
</code></pre>
<p>Der Resultierende int-Wert (unsigned) ist also: 2398133688<br />
Da du aber ein <em>int</em> als Datentyp verwendest und dieses ein signed (Vorzeichenbehafteter) Datentyp ist, hast du nicht die vollen 32 Bit für deinen Wert zur verfügung. Das Bit 31 ist das &quot;sign-Bit&quot;. Ist dieses Bit gesetzt so wird davon ausgegangen das deine Zahl im Negativen Bereich liegt.</p>
<p>Der Wert ist also in deinem Fall: -1896833608</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320524</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sun, 08 Jul 2007 07:56:17 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisprobelm on Sun, 08 Jul 2007 11:54:21 GMT]]></title><description><![CDATA[<p>Erstmal Vielen dank David für die ausfürliche erklährung dadurch versteh ich schon ein ganzen stück mehr von der Funktion. Leider gibt es ein punkt den ich immer noch nicht so recht verstehe.<br />
Damit ihr wisst wo ihr ansetzen müsst sag ich euch was soweit aus meiner sicht passiert.</p>
<pre><code class="language-cpp">(unsigned char)bytes[1] &lt;&lt; 8) | (unsigned char)bytes[0])
</code></pre>
<p>Also angenommen byte[0] ist 00010110 und byte[1] ist 01100001 dann wird byte[1] um 8 verschoben dann sollte es doch eigentlich 00000000 sein es ist doch immer noch ein char also 1 byte lang und genau da liegt das verständnisproblem ich versteh nicht warum aufeinmal 2 oder wie von David beschreiben sogar 4 bytes eines chars betrachtet werden können.</p>
<p>Ich hab mir 2 sachen überlegt die mir einleuchten würden wenn ich wüsste warum das so passiert. Einmal denke ich das das (int) da schon die finger im spiel haben könnte.<br />
Und das andere was ich für warscheinlicher halte das die überstehenden bits erst zu einer gewissen zeit verworfen werden .. z.b. zuweisung.</p>
<p>Ich hoffe jemand von euch kann mir daruf eine Antwort geben.</p>
<p>Gruß Yumi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320637</guid><dc:creator><![CDATA[Yumori]]></dc:creator><pubDate>Sun, 08 Jul 2007 11:54:21 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisprobelm on Sun, 08 Jul 2007 12:13:36 GMT]]></title><description><![CDATA[<p>Es geht eher um die 32 Bit des Zieldatentyps, die sind nämlich vorhanden:</p>
<pre><code class="language-cpp">int main()
{
	char x = 0xff;
	char y = 0x7f;

	int z = ( x &lt;&lt; 8 ) | y;
}
</code></pre>
<p>Wird zu:</p>
<pre><code class="language-cpp">mov [ebp-05], FF ; char x = 0xff
mov [ebp-11], 7f ; char y = 0x7f
movsx eax, byte ptr [ebp-05] ; x in register eax
shl eax, 08 ; x &lt;&lt; 8
movsx ecx, byte ptr [ebp-11] ; y in register ecx
or eax, ecx ; eax = eax | ecx
mov dword ptr [ebp-20], eax ; z = eax
</code></pre>
<p>Es wird erst Kopiert und schon kannst du die volle Bandbreite (deine 32 Bit) verwenden. Mit anderen Worten, du schreibst ja nicht bytes[ i ] = bytes[ i ] &lt;&lt; 8; int x = bytes[ i ];</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1320647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320647</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sun, 08 Jul 2007 12:13:36 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisprobelm on Sun, 08 Jul 2007 12:26:03 GMT]]></title><description><![CDATA[<p>Vielen dank ich glaub jetzt hab ichs verstanden <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/1320665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1320665</guid><dc:creator><![CDATA[Yumori]]></dc:creator><pubDate>Sun, 08 Jul 2007 12:26:03 GMT</pubDate></item></channel></rss>