[C] schieben (>>) Frage

OP #3037788
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
#3037834
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.
OP #3037849
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" .
Gast #3037878
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
Gast #3037887
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren