Forum: Mikrocontroller und Digitale Elektronik Bit löschen


von Micha (Gast)


Lesenswert?

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.

von johnny.m (Gast)


Lesenswert?

Speichern kannste eh nur Vielfache von 8 Bit, also 8, 16, 24, 32......
Also wie stellst Du Dir das mit dem löschen vor???

von Hannes L. (hannes)


Lesenswert?

> 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.

...

von Thomas B. (Gast)


Lesenswert?

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ß

von Micha (Gast)


Lesenswert?

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?

von johnny.m (Gast)


Lesenswert?

Indem Du das ganze Wort um die entsprechende Stellenzahl nach rechts
schiebst. Dafür gibts in Assembler ganz tolle Befehle...

von Micha (Gast)


Lesenswert?

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!?

von Nils (Gast)


Lesenswert?

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.

von johnny.m (Gast)


Lesenswert?

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...

von Micha (Gast)


Lesenswert?

Jo funktioniert,danke mal!
Ist ja eigentlich logisch nur hat ich einen Denkfehler mit den "0"en
welche rein geschoben werden.
Aber passt jetzt.

von Thomas B. (Gast)


Lesenswert?

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