Forum: Compiler & IDEs bitshift-> b = a<<4; ist nicht das selbe wie b = 4<<a;


von Michi (Gast)


Lesenswert?

Worin liegt bei beiden der unterschied?
1
a = 0x01;
2
3
b = a<<4; ergibt 16
4
5
b = 4<<a; ergibt 8

von Stephan W. (sir_wedeck)


Lesenswert?

Morgen,

einmal shiftest du den Wert von 'a' um 4 Stellen und das andere mal 
shiftest du die '4' um 'a' Stellen.

1) Gleichung:
1
b= a << 4;
ergibt:
1
b= a * ( 2 ^ 4);
2
b= a * 2 * 2 * 2 * 2;

2) Gleichung:
1
b= 4 << a;
ergibt:
1
b= 4 * (2 ^ a);
2
b= 4 * (2 ^ 1);
3
b= 4 * 2;

Stephan

von Martin (Gast)


Lesenswert?

Einmal steht da "a<<4", das andere Mal "4<<a".

Oh, guck mal, auch bei "pow(2,5)" kommt etwas anderes heraus als bei pow 
"(5,2)".

Und Wahnsinn, auch "5-2" ist etwas anderes als "2-5".

Wir sind da einer ganz heißen Sache auf der Spur vielleicht können wir 
das jetzt am Wochenende ausgiebiger erforschen?

von Beat (Gast)


Lesenswert?


von Michi (Gast)


Lesenswert?

Danke Stephan, das erklärt natürlich auch

(1<<X) somit wird die 1 verschoben und zwar um die anzahl die in X 
angegeben ist.


Vielen Dank!

von Klaus (Gast)


Lesenswert?

Martin schrieb:
> Und Wahnsinn, auch "5-2" ist etwas anderes als "2-5".

Du mußt das richtig schreiben:
(+5) + (-2) == (-2) + (+5)

Nicht Vorzeichen und Rechenoperation mischen.

MfG Klaus

von Karl H. (kbuchegg)


Lesenswert?

Michi schrieb:
> Danke Stephan, das erklärt natürlich auch
>
> (1<<X) somit wird die 1 verschoben und zwar um die anzahl die in X
> angegeben ist.
>

Was macht verblüfft:
Steht denn davon nichts in deinem C-Buch?

Denn für
 a << b
gibt es eine Besonderheit in Bezug auf die Datentypen im Gegensatz zu 
den meisten anderen Operatoren. Aber auch das sollte in einem 
vernünftigen C-Buch beschrieben sein.

von Martin (Gast)


Lesenswert?

Klaus schrieb:
> Nicht Vorzeichen und Rechenoperation mischen.

Ich hatte kein Vorzeichen verwendet.

Trinkst du? So früh am Morgen?

von Martin (Gast)


Lesenswert?

Michi schrieb:
> Worin liegt bei beiden der unterschied?

Der Unterschied liegt im unterschiedlichen Wert der Operanden. Und warum 
das einen Unterschied macht? Der Shift-Operator nicht kommutativ ist.

von Klaus (Gast)


Lesenswert?

Martin schrieb:
> Trinkst du? So früh am Morgen?

Ja, Kaffee

Martin schrieb:
> Ich hatte kein Vorzeichen verwendet.

Oh, doch. Bei der 5 hast du die Konvention verwendet, daß man am Anfang 
einer Operation das positive Vorzeichen weglassen kann. Und bei der 2 
gilt, daß man beim Aufeinderfolgen von + und - das + weglassen kann.

a = 5;
b = -2;

a + b == b + a;

siehe auch Kommutativgesetz.

Martin schrieb:
> Oh, guck mal, auch bei "pow(2,5)" kommt etwas anderes heraus als bei pow
> "(5,2)".

Die Potenzierung ist nicht kommutativ.

MfG Klaus

von Martin (Gast)


Lesenswert?

Klaus schrieb:

>> Ich hatte kein Vorzeichen verwendet.
>
> Oh, doch. Bei der 5 hast du die Konvention verwendet, daß man am Anfang
> einer Operation das positive Vorzeichen weglassen kann. Und bei der 2
> gilt, daß man beim Aufeinderfolgen von + und - das + weglassen kann.

Ebenso bei der zweiten Zahl.

> a = 5;
> b = -2;

Nein. +2.

(+5) - (+2)

Aber netter Taschenspielertrick.

>> Oh, guck mal, auch bei "pow(2,5)" kommt etwas anderes heraus als bei pow
>> "(5,2)".
>
> Die Potenzierung ist nicht kommutativ.

Eben. Wie die allermeisten Operationen nicht. Und genau das schien der 
OP nicht zu begreifen.

von Klaus (Gast)


Lesenswert?

Martin schrieb:
> Aber netter Taschenspielertrick.

Mathematisch gibt es eigentlich keine Subtraktion, sondern nur die 
Addition mit vorzeichenbehafteten Zahlen. Das macht das Leben viel 
leichter, denn die Addition ist kommutativ, Gleichungen lassen sich 
leichter umstellen.

Martin schrieb:
> Und genau das schien der
> OP nicht zu begreifen.

Ack

MfG Klaus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.