Forum: Mikrocontroller und Digitale Elektronik PIC C << Schiebeoperator soll "1" statt "0" nachschieben


von Chris _. (jetronic)


Lesenswert?

Hallo zusammen,

ein wirklich sehr tolles Forum hier.

Leider hab ich für mein Problem keine Lösung gefunden,
deshalb Frage ich mal.


Ich programmiere ein 18F2550 in C, und habe folgendes Problem:

Ich möchte mit dem Schiebeoperator  << oder >> "1"en statt "0"en 
nachschieben.

Oder eine "Rotierfunktion" für meine binären Werte,
wäre auch toll.

Das ganze soll in C passieren!


Danke und Gruß
Chris

von Thomas (Gast)


Lesenswert?

Nach dem  >> 0x7F und nach << 0xFE draufUNDen.

von Jean P. (fubu1000)


Lesenswert?

Hi,
ne billig Varainte wäre sowas hier:

unsigned char rotateLeft(unsigned char x , unsigned char *byte)
{
   while(x > 0)
   {
     *byte = (*byte << 1) + 0x01;
      x--;
   }
   return *byte;
}


unsigned char rotateRight(unsigned char x , unsigned char *byte)
{
   while(x > 0)
   {
     *byte = (*byte >> 1) + 0x80;
      x--;
   }
   return *byte;
}

Gruß

von Thomas (Gast)


Lesenswert?

oh, falschrum...

0x01 bzw. 0x80 draufODERn.

von Chris _. (jetronic)


Lesenswert?

Danke euch beiden, ich teste es Morgen mal.

von gast (Gast)


Lesenswert?

...oder erst negieren '~' , dann schieben, Ergebnis wieder negieren...

von Michael König (Gast)


Lesenswert?

Welchen C-Compiler verwendest Du denn?
Der von CCS hat für diesen Zweck die eingebauten Funktionen "shift_left" 
und "rotate_left". Die "_right"-Variante gibt es auch jeweils.

Hat natürlich den Nachteil, daß es nicht kompatibel ist.

von c.j. (Gast)


Lesenswert?

Ich benutze den Mplab C18 von Microchip.

Gibt's da auch eine fertige Funktion zum rotieren?

von Sven W. (woehlb)


Lesenswert?

Rotieren funktioniert am einfachsten mit Hilfe des Inline Assemblers, da 
in Assembler das Schieben bei den PIC's sowieso mit Rotationsbefehlen 
realisiert wird.

Ansonsten mit dem Rechtsschieben von Signed-Variablen aufpassen, an 
dieser Stelle ist der C18 nicht ganz ANSI-konform! Normalerweise werden 
beim Rechtsschieben vorzeichenrichtig Nullen oder Einsen in die Variable 
geschoben, der C18 schiebt grundsätzlich Nullen auch in die 
Signed-Variablen.

Tschau Sven!

von yalu (Gast)


Lesenswert?

x um n Bits nach links schieben mit nachgeschobenen 1en geht bspw. so:
1
  (x+1<<n)-1

von Chris _. (jetronic)


Lesenswert?

Oh ja, manchmal ists doch so einfach, aber man kommt nicht drauf!

Ich danke euch allen, werde eure Möglichkeiten mal ausprobieren.

Gruß
Jetronic

von gast (Gast)


Lesenswert?

>> x um n Bits nach links schieben mit nachgeschobenen 1en geht bspw. so:
1
  (x+1<<n)-1

Gibt's 'nen ähnlich eleganten Trick auch für's rechtsschieben?

von Chris _. (jetronic)


Lesenswert?

Also das kannst du so machen:

x = (x >> 1) + 0x80


Gruß
Jetronic

von gast (Gast)


Lesenswert?

...ähm, schon klar,
1
x = (x >> 1) + 0x80

und wenn ich mehr als einmal schieben will?
1
x = (x >> n)...
2
          ^
3
          ^

von Chris _. (jetronic)


Lesenswert?

ja bei n=2, müsste das so gehen:

x = (x >> 2) + 0xC0   // binär 1100 0000

n=3:

x = (x >> 3) + 0xF0   // binär 1110 0000

von gast (Gast)


Lesenswert?

n sollte variabel bleiben.
Mehr als das fällt mir dazu auch nicht ein.
1
x = (x >> n) | ~(0xFF >> n);

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.