Hi,
Auch wenn schon fast alles gesagt wurde, ich konnte nicht wiederstehen. Was erwartest Du eigentlich von einem left-shift bei einer Zeichenkette? Die ersten drei Buchstaben sollen verschwinden? Sämtliche Bit-Werte werden nach links verschoben? Das kann nicht funktionieren;) Der Shift-Operator dient zur Verschiebung von "Bits". Um ein LShift zu vollführen wird der Wert in die Prozessorregister geladen *1. Dort werden dann die Bits um x nach links verschoben.
00000001 //- value (hier = 1)
00000010 //- lshift 1 mal
00000100 //- lshift 2 mal
00001000 //- lshift 3 mal
Beispiel:
i = 1;
i <<= 3; //- i gleich 8
//- binär bedeutet basis 2 (dezimal = basis 10)
8 == 0x08 ==
0 0 0 0 1 0 0 0 =
0*2^7+0*2^6+0*2^5+0*2^4+1*2^3+0*2^2+0*2^1+0*2^0 =
0*128+0*64 +0*32 +0*16 +1*8 +0*4 +0*2 +0*1 =
8
Ein Zeichen entspricht einem Byte bzw. acht Bit. Ganz früher war ein Zeichen sogar nur sieben Bit groß (ASCII) aber dass ist jetzt nicht Sache. Heutzutage verwendet man jedenfalls 16 Bit (UNICODE). Damit lassen sich alle Schrift-Zeichen der Welt (außer zwei oder drei) binär darstellen. Aber auch das spielt keine Rolle denn es geht um eine bitweise Verschiebung, unabhängig vom Typ*2. Wie bereits erwähnt werden die Zeichen bzw. die Werte, auf denen eine Shift-Operation (links oder rechts, durch 2 oder mal 2) ausgeführt werden soll, in die Register des Prozessors geladen. Das geht recht fix. Eine Zeichenkette hingegen besteht aus x-Bytes. Das heißt es müsste diese Shift-Operationen x-mal durchgeführt werden (pro Zeichen). Es findet aber eine bitweise und keine byte- oder wordweise Verschiebung statt. Das Problem ist folgendes : was passiert mit den Bits, welche verschoben (rausfallen) werden? Genau, normalerweise müssten diese dem links davon stehendem Byte zugeordnet werden.
Beispiel (die Binärwerte entsprechen nicht den hier angegebenen Zeichen!):
'H' 'i' ',' (=3 Byte, hier jedenfalls;)
Byte 2 | Byte 1 | Byte 0
00000001 01000010 00100000 <<= 3 =
00001010 00010001 00000000 ???
Das kann nicht funktionieren denn siehe *1.
Es kann also nicht der gesamte String in die Register geladen werden. Somit gehen Bits verloren oder wären nur über recht aufwendige Operationen dem jeweiligem linken bzw. rechtem Byte zuzuordnen. Wäre die LShift-Operation auf jedes einzelne Bit angewandt worden, so würde dies
00001000 00000010 00000000 ergeben, denn Bits die das Register verlassen gehen verloren.
Ich hoffe das alles war nicht zu technisch oder zu kompliziert (das geht auch noch schlimmer ;) und trägt zum Verständnis von Bit-Operationen wie SHIFT, UND, ODER, OR, XOR und Co bei.
sabine
*1) Die Register haben eine feste Größe (8, 16, 32 oder 64 Bit), dein String hat keine feste Größe
2*) Ein Compiler kennt nur zwei Typen : BYTE(8Bit) und WORD(16Bit).