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
Nach dem >> 0x7F und nach << 0xFE draufUNDen.
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ß
oh, falschrum... 0x01 bzw. 0x80 draufODERn.
Danke euch beiden, ich teste es Morgen mal.
...oder erst negieren '~' , dann schieben, Ergebnis wieder negieren...
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.
Ich benutze den Mplab C18 von Microchip. Gibt's da auch eine fertige Funktion zum rotieren?
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!
x um n Bits nach links schieben mit nachgeschobenen 1en geht bspw. so:
1 | (x+1<<n)-1 |
Oh ja, manchmal ists doch so einfach, aber man kommt nicht drauf! Ich danke euch allen, werde eure Möglichkeiten mal ausprobieren. Gruß Jetronic
>> 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?
Also das kannst du so machen: x = (x >> 1) + 0x80 Gruß Jetronic
...ähm, schon klar,
1 | x = (x >> 1) + 0x80 |
und wenn ich mehr als einmal schieben will?
1 | x = (x >> n)... |
2 | ^
|
3 | ^
|
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.