Hi zusammen, steh gerade etwas auf dem Schlauch und hoffe mir kann jemand helfen. Wie kann ich ein Bit in einem 16bit word löschen? Also nicht auf "0" setzen sondern löschen damit ich nur noch 15 Bit habe. Benutze einen ATMega und Assembler. Danke schonmal für eure Hilfe.
Speichern kannste eh nur Vielfache von 8 Bit, also 8, 16, 24, 32...... Also wie stellst Du Dir das mit dem löschen vor???
> Also nicht auf "0" setzen sondern löschen damit ich nur noch 15 Bit > habe. Im Dualsystem gibt es aber nur "0" oder "1". "Nichts" ist da nicht vorgesehen. Eine 16-Bit-Zahl wird immer 16 Bit haben, jedes ihrer Bits wird immer 0 oder 1 sein. ...
Dir wird nichts anderes übrigbleiben, als Bits zu verschieben und die damit unbenutzt werdenden höchsten Bits auf einen dir genehmen Wert zu setzten (vmtl. 0). Jetzt mal ins Unreine ein Ansatz: Ist - yyyy.yyAx.xxxx.xxxx Soll - 0yyy.yyyx.xxxx.xxxx A - unwillkommenes Bit x - niedriger benutzter Wortteil y - hoher benutzter Wortteil - den Wert trennen in niedrigen und hohen benutzten Wortteil (entsprechend maskieren halt) - den hohen Teil um eins nach rechts schieben - beide Teile wieder kombinieren. Gruß
Hmm hab ich mich vielleicht blöd ausgedrückt. Also nochmal. hab wie gesagt eine 16 Bit Zahl. Nun brauch ich davon aber angenommen nur die ersten 12 Bits. Wie kann ich das in Assembler realisieren?
Indem Du das ganze Wort um die entsprechende Stellenzahl nach rechts schiebst. Dafür gibts in Assembler ganz tolle Befehle...
Um den Wert nicht zu verfälschen muss ich dann ror verwenden wenn ich das richtig sehe. Dann erst mein high byte und dann das low byte verschieben!?
Bitweise shiften dürfte da wohl die antwort sein... lsr - logical shift right lsl - logical shift left Wenn Du also nur die 12 höchstwertigsten Bits eines 16-bit-Wortes benötigst, schiebst du das ganze viermal nach rechts. Wird von ober mit Nullen aufgefüllt.
Mach es z.B. so: Schiebe das High-Byte (also die höherwertigen acht Bit) mit lsr um eine Stelle nach rechts. Dadurch wird der Inhalt des niederwertigsten Bits ins Carry-Flag geschoben und von links eine Null reingeschoben. Dann wendest Du sofort danach (ohne dass in der Zwischenzeit das Carry verändert wird!!!) auf das Low-Byte ror an. Dadurch wird das Low-Byte um eine Stelle nach rechts geschoben und von links wandert der Übertrag von der ersten Operation rein. Wenn Du das viermal hintereinander machst, hast Du die oberen zwölf Bits von Deinem 16-Bit-Wort auf die unteren zwölf Stellen verschoben. Ich denke, das ist es, was Du wolltest...
Jo funktioniert,danke mal! Ist ja eigentlich logisch nur hat ich einen Denkfehler mit den "0"en welche rein geschoben werden. Aber passt jetzt.
"Nun brauch ich davon aber angenommen nur die ersten 12 Bits." Shifts und Rotationen sind auch nicht unbedingt was du brauchst. Du willst möglicherweise Bits maskieren und da ist das bitweise UND dein Freund. Einfach deinen Wert mit einer Maske ver-UND-en und die unerwünschten Bits sind Null. Istwert yyyy.xxxx.xxxx.xxxx Maske 0000.1111.1111.1111 UND 0000.xxxx.xxxx.xxxx Ansonsten musst du dir mit Shifts, Rots und Maskierung alles selber bauen.
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.