Was bedeutet 1<<4 im Assembler Tutorial

OP #2063845
Lesenswert?

Guten Tag.

Gehe grad das Assembler Tutorial durch und im Bereich LCD kommen 
plötzlich neue "Teile"

Hier bei handelt es sich einmal um $42 ($Nummer), wo ich davon ausgehe 
dass das "$" mit "0x" gleich zu setzen ist.

Wo ich aber nichts zu gefunden habe, oder mit zusammen reimen konnte ist 
"1<<4". Was bedeutet dieses "<<"?
#2063869
Lesenswert?

Michael Dierken schrieb:
> Muss dazu das Register bereits mit 0x01 geladen sein, oder hat man auch
> bei 0x00 ein 0b00010000?
>
> Wenn man ein 0x03 hat, hat man dann nach 1<<4 ein 0b00110000?

Nein, Du legst damit eine Konstasnte fest, in der Bit 4 gesetzt ist und 
alle anderen Bits gelöscht sind. Diese Konstante kannst Du
- zuweisen (ldi)
- verodern (ori, sbr)
- verunden (andi, cbr mit Komplement)

Die Schreibweise 1<<4 macht erst richtig Sinn, wenn man die Bitnamen 
benutzt, wie sie z.B. bei den I/O-Registern (Steuerungsregister der 
internen Peripheriemodule) verwendet werden, z.B.:

 ldi wl,(1<<refs1)|(1<<refs0)|(1<<adlar)
 sts admux,wl       ;ADC linksbündig mit interner Referenz auf ADC0

Weitere Infos erhältst Du in der Hilfe zum AVR-Studio unter 
AVR-Assembler, Direktiven.

...
#2063883
Lesenswert?

1<<4 bedeutet ja, dass du die ->1<- binär um 4 nach links shiftest.
Würdest du 0<<4 schreiben, dann bekämst du immer noch 0 raus.
Du kannst dir folgendes (bezüglich positiver Ganzzahlen) merken.

binär  dezimal
0000    0
0001    1
0010    2
0011    3
0100    4
0101    5
0110    6
0111    7
1000    8
1001    9
1010   10
1011   11
1100   12
1101   13
1110   14
1111   15

Schau mal, was passiert, wenn du eine Zahl nimmst und shiftest.

Nehmen wir mal 1 und shiften sie um 1 nach links, dann kommen wir auf 
die 2. Warum?
Die 1 wird ja durch 0001 dargestellt, jetzt nehmen wir das und shiften 
um 1 nach links und kommen auf 0010 (es wird von rechts ja mit Nullen 
aufgefüllt). 0010 entspricht aber der 2. Wenn man dieses Spielchen 
weiterführt, so bekommt man heraus, dass man ganz unkompliziert damit 
das "Multiplizieren mit 2" lösen kann.

1<<3 == 0001<<3 == 0010<<2 == 2<<2
2<<2 == 0010<<2 == 0100<<1 == 4<<1
4<<1 == 0100<<1 == 1000<<0 == 8<<0

Also mit anderen Worten 1<<n == 2^n (also 2 hoch n)
Und allgemeiner x<<n == x * 2^n

Sei allerdings vorsichtig mit Dingen, die geschehen können.
Solches betrifft zum Beispiel zu großes Shiften. Wenn du von 4 Bit 
ausgehst, also xxxx zur Verfügung hast, dann darfst du nicht 1<<4 
schreiben, denn das wäre 0001->0010->0100->1000->0000. Also nicht das 
gewünschte Ergebnis. Auch musst du vorsichtig sein, wenn du eine Zahl im 
Zweierkomplement darstellst, hier kommt dem LSB nämlich eine besondere 
Bedeutung zu.
Das Rechts-Shiften kann man im weiteren nutzen um das Teilen durch zwei 
Effizient umzusetzen, allerdings ist hier noch mehr Vorsicht geboten, 
denn 3>>1 gibt 1 und nicht 1,5 zurück... Außerdem kommt hier bei der 
Darstellung im Zweikomplement hinzu, dass du zwischen logischem und 
arithmetischem Shiften unterscheiden musst. Das hast du beim Linksshift 
allerdings nicht.

LG

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