Forum: PC-Programmierung Wie schiebt man in c im Kreis


von haha (Gast)


Lesenswert?

Hallo,

ich möchte in einem Kreis/Ring schieben, d.h. wie mit dem >> Operator 
nur dass das herausgeschobene Bit auf der anderen Seite wieder 
reingeschoben wird. Prozessor ist ein Atmel wenn das von Bedeutung ist.

Gibts da eine schnelle Lösung / Befehl?
Oder muss man das Bit abfragen dann schieben und per Hand wieder 
einfügen

z.B. so
if (0x80 & variable) ((variable << 1) + 1); else (variable << 1);
(nicht ausprobiert ... aber so in der Art)

Danke

von haha (Gast)


Lesenswert?

sorry Programmiersprache ist C, mit Assembler würde es ja einen Befehl 
gehen. Viell. mit dem einem Inlineassemblerbefehlt, aber dann wüsste 
nicht wie ich auf meine Variable names variable zugreifen müssen.

von codehamster (Gast)


Lesenswert?

http://de.wikipedia.org/wiki/Bitweiser_Operator#C.2C_C.2B.2B_und_Java

ich bin mir nicht 100% sicher, glaube aber dass dies in Standard c nicht 
implementiert ist.

ev. Suchbegriff: arithmetic shift

MFG codehamster

von Salewski (Gast)


Lesenswert?


von Rolf M. (rmagnus)


Lesenswert?

haha schrieb:
> ich möchte in einem Kreis/Ring schieben, d.h. wie mit dem >> Operator
> nur dass das herausgeschobene Bit auf der anderen Seite wieder
> reingeschoben wird. Prozessor ist ein Atmel wenn das von Bedeutung ist.

Da es von Atmel viele verschiedene Architekturen gibt, ist der 
Hersteller alleine nicht von Bedeutung.

> Gibts da eine schnelle Lösung / Befehl?

In C gibt es da nichts einfaches. Entweder mußt du inline assembler 
nutzen, oder es eben so machen:

> Oder muss man das Bit abfragen dann schieben und per Hand wieder
> einfügen

von Ghost (Gast)


Lesenswert?

Oh Mann, einen Post obendrüber steht doch, wie es einfach in C gehen 
kann.

von Sascha (Gast)


Lesenswert?

codehamster schrieb:
> ev. Suchbegriff: arithmetic shift

Nein.

von Rolf M. (rmagnus)


Lesenswert?

Ghost schrieb:
> Oh Mann, einen Post obendrüber steht doch, wie es einfach in C gehen
> kann.

Das ist aber auch nix anderes als

Rolf Magnus schrieb:
>> das Bit abfragen dann schieben und per Hand wieder einfügen

nur daß halt ein Oder statt einer Abfrage benutzt wird. Übrigens macht 
gcc bei mir aus keinem der beiden einen rotations-Befehl.

von (prx) A. K. (prx)


Lesenswert?

Rolf Magnus schrieb:
> nur daß halt ein Oder statt einer Abfrage benutzt wird. Übrigens macht
> gcc bei mir aus keinem der beiden einen rotations-Befehl.

So gehts, mit gcc 4.1 für x86 (ebenso 4.2 für Power):
1
unsigned rot(unsigned x)
2
{
3
        return x << 1 | x >> 31;
4
}
1
rot:
2
        movl    4(%esp), %eax
3
        rorl    $31, %eax
4
        ret

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.