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
Die Zahl "1" um n-Stellen nach links schieben: Ergebnis=1<<binaerwert; mfG vom ingo
Ein Array wäre 8 Bytes groß. Das ist zwar unelegant aber vermutlich die effizienteste Lösung.
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?
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.
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.
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.
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.