Forum: Compiler & IDEs Binärzahl Bits durchschieben


von Daniel G (Gast)


Lesenswert?

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?

von Daniel G (Gast)


Lesenswert?

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?

von Max H. (hartl192)


Lesenswert?

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;

von Daniel G (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Max H. (hartl192)


Lesenswert?

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.

von Daniel G (Gast)


Lesenswert?

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?

von Daniel G (Gast)


Lesenswert?

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

von Max H. (hartl192)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Daniel G (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.