mikrocontroller.net

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


Autor: Chris __ (jetronic)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach dem  >> 0x7F und nach << 0xFE draufUNDen.

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh, falschrum...

0x01 bzw. 0x80 draufODERn.

Autor: Chris __ (jetronic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke euch beiden, ich teste es Morgen mal.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...oder erst negieren '~' , dann schieben, Ergebnis wieder negieren...

Autor: Michael König (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: c.j. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich benutze den Mplab C18 von Microchip.

Gibt's da auch eine fertige Funktion zum rotieren?

Autor: Sven Woehlbier (woehlb)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: yalu (Gast)
Datum:

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

Autor: Chris __ (jetronic)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gast (Gast)
Datum:

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

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

Autor: Chris __ (jetronic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also das kannst du so machen:

x = (x >> 1) + 0x80


Gruß
Jetronic

Autor: gast (Gast)
Datum:

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

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

Autor: Chris __ (jetronic)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gast (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.