Guten Abend, Habe bisher nur sehr grundlegend mit C gearbeitet, und stoße jetzt auf ein Problem: Ich muss für mein Programm bei eine Binärzahl (in diesem Fall 6-stellig und als Char deklariert) die Bits nach links durchschieben. Das durchschieben soll bei einmaligem Aufrufen um einen Schiebewert geschehen. Beispiel: Aus 0b100010 Soll werden: 1. 0b000101 2. 0b001010 3. 0b010100 Kann mir jemand sagen, wie man eine solche Funktion implementiert?
Max H. schrieb im Beitrag #3669516:
> zahl=zahl<<1;
Und das funktioniert auch dann, wenn das Bit an 1. Stelle ist, nicht
weiter nach links geschoben werden kann und dann an die letzte Stelle
springt?
Ich glaube du willst die bits rotieren und nicht schieben, hab das zu spät gemerkt und meinen Post deshalb gelöscht. 6 bits nach links rotieren könnte so aussehen:
1 | zahl=(zahl<<1); |
2 | if(zahl&0x40) |
3 | zahl|=0x01; |
Und dann falls nötig noch die zwei höchstwertigen bits auf null setzen:
1 | zahl&=0x3F; |
Max H. schrieb: > Ich glaube du willst die bits rotieren und nicht schieben Sorry, mein Fehler, ja rotieren war gemeint.
1 | zahl=(zahl<<1); |
2 | if(zahl&61) |
3 | zahl|=0b1; |
4 | |
5 | zahl&=0b111101; |
Das wäre doch das gleiche richtig? Oder hats nen tieferen Sinn warum du alles im Hexadezimalsystem schreibst? Danke schonmal
Daniel G schrieb: > Max H. schrieb: >> Ich glaube du willst die bits rotieren und nicht schieben > > Sorry, mein Fehler, ja rotieren war gemeint. > >
1 | > zahl=(zahl<<1); |
2 | > if(zahl&61) |
3 | > zahl|=0b1; |
4 | >
|
5 | > zahl&=0b111101; |
6 | >
|
> > Das wäre doch das gleiche richtig? Oder hats nen tieferen Sinn warum du > alles im Hexadezimalsystem schreibst? Weniger fehleranfällig, weil man sich bei der Anzahl an Stellen verzählt hat. Besides: die Umwandlungstabelle von Hex-Ziffern auf Binär muss jeder µC-Programmierer im Schlaf kennen. Ist nicht wirklich schwer. Die ist so was ähnliches wie das kleine Einmal Eins.
1 | Hex Binär Hex Binär |
2 | |
3 | 0 0000 8 1000 |
4 | 1 0001 9 1001 |
5 | 2 0010 A 1010 |
6 | 3 0011 B 1011 |
7 | 4 0100 C 1100 |
8 | 5 0101 D 1101 |
9 | 6 0110 E 1110 |
10 | 7 0111 F 1111 |
> if(zahl&61)
Dezimal ist allerdings noch eine Spur dämlicher als Binär.
Daniel G schrieb: > Das wäre doch das gleiche richtig? Oder hats nen tieferen Sinn warum du > alles im Hexadezimalsystem schreibst? Kurschreibweise von binär, gewohnheit. 0x40=64 dez und 0x3F=0b00111111 hast du falsch umgerechnet.
Karl Heinz schrieb: >> if(zahl&61) > Dezimal ist allerdings noch eine Spur dämlicher als Binär. Versteh ich nicht so ganz, genauso wenig die Fehleranfälligkeit. Ich dachte mir je weniger man umrechnen muss, desteo fehlerunanfälliger ist das Programm? Oder wie meintest du das?
Max H. schrieb: > Kurschreibweise von binär, gewohnheit. 0x40=64 dez und 0x3F=0b00111111 > hast du falsch umgerechnet. Aah, da ergibt das ganze auch mehr Sinn :P
Der uC arbeitet intern mit binär, dahalb macht es vor allem bei Bitmanipulationen viel mehr Sinn in Binär oder Hex zu denken. Wenn ich z.B 0x33 lese sehe ich sofort welche bits gesetzt sind, bei 51d müsste ich erst nachdenken/umrechnen.
Daniel G schrieb: > Karl Heinz schrieb: >>> if(zahl&61) >> Dezimal ist allerdings noch eine Spur dämlicher als Binär. > > Versteh ich nicht so ganz, genauso wenig die Fehleranfälligkeit. > > Ich dachte mir je weniger man umrechnen muss, desteo fehlerunanfälliger > ist das Programm? Oder wie meintest du das? Genau darum gehts. Du bist beim Umrechnen durchgefallen. schnelle Frage: welche BIts sind in dezimal 73 auf 1 und welche sind auf 0? wenn du das ohne Papier und Bleistift bzw. ohne Taschenrechner nur im Kopf in unter 6 Sekunden schaffst, dann zieh ich meinen Hut. Welche Bits sind in Hex 0x49 auf 1 und welche auf 0? Nimm die auswenig gelernte Tabelle von oben her und setz zusammen. Das Bitnuster für 4 ist 0100 und das Bitmuster für 9 ist 1001. Das Bitmuster für 0x49 ist daher 01001001. PS: DIe Tabelle ist nicht weiter schwer zu merken. Da gibt es ein paar Zusammenhänge, die sich leicht einprägen.
Karl Heinz schrieb: > Welche Bits sind in Hex 0x49 auf 1 und welche auf 0? > Nimm die auswenig gelernte Tabelle von oben her und setz zusammen. Das > Bitnuster für 4 ist 0100 und das Bitmuster für 9 ist 1001. Das Bitmuster > für 0x49 ist daher 01001001. Vielen Dank, hat mir in Sachen Logik gut weitergeholfen :)
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.