Forum: Mikrocontroller und Digitale Elektronik [C] schieben (>>) Frage


von Max B. (tyrann619)


Lesenswert?

Hallo, ich bin gerade dabei das Buch "Embedded C Programming and the 
Atmel AVR" zu lesen. Und da habe ich ein Verständnisproblem an folgender 
stelle.
1
char first,second,third,seed
2
while{PINA.0)            // Wait fot a button and
3
seed++;                  // let the counter roll over and
4
                         // over to form a seed.
5
6
first = second = third = seed; // preload the columns
7
8
do                       // Mix up the numbers
9
{                        // while waitinq for tutton release.
10
first ^= seed>>1;        // Exclusiwe ORing in the moving seed
11
second^= seed>>2;        // can really stir up the numbers.
12
third ^= seed>>3;
13
seed++; // Keep rollins over the seed pattern
14
} while (PINA.0 == 0) ;  // while the button is pressed.

So, nun folgen meine Überlegungen:
Angenommen der Button wird gedrückt wenn seed 01001011 ist
first,second,third bekommen den wert vom seed
first = 01001011 ; second = 01001011 ; third= 01001011

Dann kommt die do while schleife:
first = first ^ seed>>1;
Und hier ist mein Problem.
first = 01001011 ^ 01001011>>1;

im buch steht am Anfang bei ">>":
schiebt den linken Operand um ein vielfaches des rechten Operands nach 
rechts.
Wenn da 1>>5 steht heißt "schiebe die 1 5mal nach rechts: 00000100

Aber wie geht das damit? 01001011>>1

von Stefan E. (sternst)


Lesenswert?

Max B. schrieb:
> Wenn da 1>>5 steht heißt "schiebe die 1 5mal nach rechts: 00000100

Nein. 1000000 ist 128 und nicht 1.

Max B. schrieb:
> Aber wie geht das damit? 01001011>>1

Ach komm, wie sieht das Ergebnis aus, wenn du alles um eine Stelle nach 
rechts schiebst?

von Max B. (tyrann619)


Lesenswert?

Wenn ich das um eine Stellen nach rechts schiebe wird aus
01001011     -->    00100101     richtig ?


was meinst du mit 10000000 = 128? is schon klar, das 128 in dezimal ist

meinst du das mein selbst gewähltes Beispiel eig. so aussieht?:
10000000 >> 5   -> 00000100

von Karol B. (johnpatcher)


Lesenswert?

Max B. schrieb:
> was meinst du mit 10000000 = 128? is schon klar, das 128 in dezimal ist

Anscheinend hast du das aber oben noch anders gesehen:

Max B. schrieb:
> Wenn da 1>>5 steht heißt "schiebe die 1 5mal nach rechts: 00000100

Max B. schrieb:
> Wenn ich das um eine Stellen nach rechts schiebe wird aus
> 01001011     -->    00100101     richtig ?

Ja. Das letzte Bit fällt weg, alle anderen "rutschen" um eine Stelle 
nach.

von amateur (Gast)


Lesenswert?

Dein Beispiel ist unglücklich gewählt.
  1=0b00000001
128=0b10000000

  1>>5 ist 0

128>>5 ist 4

von Max B. (tyrann619)


Lesenswert?

Ah ok dann habe ich das glaube nun verstanden.
Also muss man sich 8 bits wie auf einem Band vorstellen wo hinten und 
vorne unendlich viele Nullen sind.
...000000|01001011|0000000... wird nach rechts gedreht
...000000|00100101|1000000... und alles andere als die 8 bits fallen 
weg.

Gut vllt. ne umständliche Vorstellung aber bis vor dem Thread dachte 
ich,
dass das man 00000000 und dann eine 1 von links (10000000) nach rechts 
geschoben wird.. bei dem Bsp. aus dem buch funktionierte das nicht, weil 
ich nicht wusste wie man eine andere Zahl außer 0 und 1 darein schieben 
kann.

Gut danke... schade das ich nirgends gefunden habe, das die 1<<5 -> 
00000001<<5 entspricht. Dachte bis jetzt immer, dass die 1 von 
links/rechts "reinkommt" .

von amateur (Gast)


Lesenswert?

Vorsicht: Es muss heißen: Zahlen und nicht die "8 Bits".

Es stimmt: Die Mikrocontroller arbeiten oft mit 8 Bit, aber der 
C-Compiler schiebt auch 16-Bit und 32-Bit Zahlen durch die Gegend.

Und bitte verwechsle nicht Konstanten und Statements.
Variable = Variable << 5; // Ist ein Befehl/Anweisung/Statement oder so
                          // Egal was in "Variable" steht, es wird
                          // verschoben
Variable = (1<<5);        // Ist die Initialisierung mit einer 
Konstanten
                          // z.B. 0b00100000

von Hmm (Gast)


Lesenswert?

@ Max

Ich empfehle Dir die Lektüre eines C-Buches. Dort wird genau erklärt, 
was für Operanden z.B. der Schiebeoperator hat und wie er sich verhält.
Abgesehen davon, das Du uns die gefühlt 112.342.387ste Frage danach 
ersparst, lernst Du noch, zu lernen.

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.