Forum: Mikrocontroller und Digitale Elektronik Binär zu 1 aus 8


von M.R. (Gast)


Lesenswert?

Wie kann ich in C eine Binärzahl (3 bit) in 1 aus 8 umwandeln?
Mit 8 if müsste es funktionieren. Gibt es eine einfachere, mit weniger 
Schreibaufwand verbundene  Lösung?

000 --> 0000 0001
001 --> 0000 0010
010 --> 0000 0100
011 --> 0000 1000
100 --> 0001 0000
101 --> 0010 0000
110 --> 0100 0000
111 --> 1000 0000

von Sven B. (scummos)


Lesenswert?

(1 << d) müsste funktionieren, wobei d z.B. 0b010 = 2 ist.

Grüße,
Sven

von Ingo W. (Gast)


Lesenswert?

Die Zahl "1" um n-Stellen nach links schieben:
Ergebnis=1<<binaerwert;
mfG vom ingo

von Georg G. (df2au)


Lesenswert?

Ein Array wäre 8 Bytes groß. Das ist zwar unelegant aber vermutlich die 
effizienteste Lösung.

von Karl H. (kbuchegg)


Lesenswert?

M.R. schrieb:
> Wie kann ich in C eine Binärzahl (3 bit) in 1 aus 8 umwandeln?
> Mit 8 if müsste es funktionieren. Gibt es eine einfachere

einfacher ist relativ

   1 << i

ist für dich einfacher, für den µC aber nicht

utin8_t mask[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };

  byte = mask[i];

ist eine Variante, die sowohl vom Aufwand für dich, als auch für den µC 
ein Mittelweg darstellt.

Oft ist es auch so, dass man durch eine einfache Umformung im Programm 
dem µC das Leben einfacher machen kann. IN welchem Zusammenhang taucht 
denn das Problem auf?

von Sven B. (scummos)


Lesenswert?

Wieso ist denn ein Leftshift für den uC ein nennenswerter Aufwand?

von Duda (Gast)


Lesenswert?

Kommt auf den Prozessor an.
Einige können nur um eine Stelle Schieben. Dann sind es im Extremfall 8 
Befehle - beispielsweise 8 Takte.
Das Auslesen aus einer Tabelle dauert aber eventuell nur zwei Takte.

von Sven B. (scummos)


Lesenswert?

Ah, ok. Die großen Architekturen können das ja soweit ich weiß in einem 
Takt.

von adsf (Gast)


Lesenswert?

Wäre mal interessant ob es Compiler gibt die das durch einen Lookup 
ersetzen wenn es schneller ist und sie noch Speicher zur Verfügung 
haben.

von Duda (Gast)


Lesenswert?

Sven B. schrieb:
> Ah, ok. Die großen Architekturen können das ja soweit ich weiß in einem
> Takt.

Die hier vorherrschende Architektur (AVR) kann pro Takt nur ein Bit 
schieben.

von M.R. (Gast)


Lesenswert?

Ich arbeite mit einem PIC18F. Der Grund warum ich diese Umwandlung 
brauche ist einen Punkt mit den Koordinaten x, y auf einem KS0108 LCD 
auszugeben. Die Bits 5:3 von y enthalten die Page 2:0 enthalten die 
Position in der Page

von Karl H. (kbuchegg)


Lesenswert?

M.R. schrieb:
> Ich arbeite mit einem PIC18F. Der Grund warum ich diese Umwandlung
> brauche ist einen Punkt mit den Koordinaten x, y auf einem KS0108 LCD
> auszugeben. Die Bits 5:3 von y enthalten die Page 2:0 enthalten die
> Position in der Page

?
In diesem Zusammenhang ist mir allerdings die von dir geforderte 
Funktionalität aus dem Eröffnungsposting noch nie untergekommen.

Ich denke du hast dich hier verrant.

von M.R. (Gast)


Lesenswert?

Wenn y z.B. 30 ist:
30 = 0b00 011 110
--> Page: 3
--> Bit 6

Also muss ich in die Page x,3 0b0010 0000 schreiben bzw. den alten 
Inhalt &0b00100000

von Karl H. (kbuchegg)


Lesenswert?

M.R. schrieb:
> Wenn y z.B. 30 ist:
> 30 = 0b00 011 110
> --> Page: 3
> --> Bit 6

Ah ok.
Für die Bitaddressierung innerhalb eines Bytes benötigst du natürlich 
die Funktion. Mein Fehler - daran hab ich jetzt nicht gedacht.

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.