Forum: Mikrocontroller und Digitale Elektronik Bit schieben (Links-Shift)


von Dkl (Gast)


Lesenswert?

Hallo,

im AVR-Studio in C möchte ich gerne eine 8-Bitvariable um genau 1 nach 
links schieben, also dass z.B. die Binärzahl 10000010 zu 00000101 wird.

Das macht man sicher irgendwie mit "<<"! Eventuell so, wenn man den 
Inhalt eines Ports um 1 verschieben will?

PORTA |= ( 1 << PORTA );

Gibt es irgendwo auf dieser Seite hier einen Artikel zu 
Bitmanipulationen?

von g457 (Gast)


Lesenswert?

> eine 8-Bitvariable um genau 1 nach links schieben, also dass z.B. die
> Binärzahl 10000010 zu 00000101 wird.

Das ist nicht Schieben sondern Rotieren und das gibts nicht nativ in C. 
Kann man aber leicht aus zweimaligem Schieben und ein bisschen verodern 
hinsimulieren.

von Dkl (Gast)


Lesenswert?

g457 schrieb:
> ... ist nicht Schieben sondern Rotieren

Schon mal Danke für die Info!

von Dkl (Gast)


Lesenswert?

Man könnte die Variable in 16Bit umwandeln und mit 2 multiplizieren und 
gucken, ob sie größer als 255 ist. Wenn ja, wird eine 1 addiert, sonst 
nicht.
Danach wird die Variable wieder in 8Bit umgewandelt (also das HB 
abgeschnitten).

So müsste es gehen... :O)

von Thomas E. (thomase)


Lesenswert?

Dkl schrieb:
> Man könnte die Variable in 16Bit umwandeln und mit 2 multiplizieren und
> gucken, ob sie größer als 255 ist. Wenn ja, wird eine 1 addiert, sonst
> nicht.
> Danach wird die Variable wieder in 8Bit umgewandelt (also das HB
> abgeschnitten).
>
> So müsste es gehen... :O)

Ja. Oder so:
1
unsigned char temp = PORTA;
2
unsigned char bit0 = !!(temp & (1 << 7));
3
temp <<= 1;
4
temp |= bit0;
5
PORTA = temp;

mfg.

: Bearbeitet durch User
von Dkl (Gast)


Lesenswert?

Elegant!

unsigned char = uint8_t im AVR-Studio?

Danke!

von Sebastian W. (wangnick)


Lesenswert?

Oder so:
1
signed char temp = PORTA;
2
PORTA = temp<<1 | temp<0;

LG, Sebastian

von eric (Gast)


Lesenswert?

Oder so:
1
unsigned char temp = PORTA;
2
PORTA = (temp<<1) | (temp>>7);

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.