mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bitmanipulation


Autor: Geri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi!

Ich bräuchte bitte hilfe bei einer Bitmaipulation!

Ich habe ein byte zu manipulieren und zwar so!

b11111111

bräuchte jetzt immer eine 0 in den oberen 4 bits und in den unteren 4
bits

das heißt:
01110111
diese 2 nullen sollen sich getrennt von einander verschieben lassen!
das aber immer nur in den 4 bits!

Wie mache ich das?

mfg, geri

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...so richtig habe ich Dein Problem nicht verstanden,
wie sollen die Nullen genau verschoben werden?

Soll es immer die gleiche Verschiebereihenfolge in den beiden Nibbles
sein?

Wenn ja, dann wäre es z.B. so möglich:

ldi temp, 01110111
ldi temp, 11011101
ldi temp, 10111010

Ist die Aufgabenstellung etwas komplzierter, dann könnte man mit
SWAP, BST, BLD usw. sicherlich auch umständlicher zum Ziel kommen.

Bernhard

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wozu gibt´s denn die Befehle ROL und ROR? Bei entsprechend gesetzem oder
gelöschtem Carry machen die genau das was Du willst (vorausgesetzt, Du
proggst in Assembler).

Autor: GeRi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich programmiere in C, weil ich assembler nicht wirklich gut kann!

Gibts dafür eine Lösung in C auch????

Autor: ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du koenntest die 8 bit auslesen, in 2 Arrays zu je 4 bit teilen und dort
getrennt manipulieren und danach wieder einschreiben ...

Autor: Simon Küppers (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ganz ehrlich? man müsste erstmal verstehen was du vor hast...

Autor: GeRi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja das könnte ich, will es aber ohne arrays machen!!!

 die brauchen so viel speicher im data deswegen möchte ich es nicht mit
arrays machen!!!

Autor: peter zerl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ganz einfach
byte a= 0b11110111
byte b= 0b10111111
dann kannst du herumschieben wie du willst
a << 1
b >> 1
und dann verknüpflst du das ganze mit nem logischen und

byte ausgabe = a && b

Ausgaberegiser = ausgabe


würd ich so machen hab mir allerdings noch nicht angesehen wie es mit
dem speicher aussieht
kann aber nicht soviel brauchen

Autor: Geri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die nützlichen tipps!

Hab das problem mit einer Zeile lösen können!



Danke!

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aha... und wie?

Autor: peter zerl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
würd mich jetzt auch interessieren

Autor: Kai Riek (kairiek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jupp,

ZEIGEN!!!

Muss ja dann wohl sehr einfach gewesen sein...

Autor: Conlost (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bekomme von C-Code immer Kopfschmerzen,
aber das nehme ich in diesem Fall gerne auf mich.
Ich möchte auch gerne wissen wie das geht.

Es grüsst,
Arno

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bit-Manipulationen gehen mit

( Originalwert zwischenkopieren , Ausgangswert vorab nullsetzen ),
dann über  UND - XOR - Maskierungen , evtl. schieben , zuletzt mit OR
zusammenmaskieren.
Manchmal braucht man mehrere interne Zwischenwerte, damit's
übersichtlicher bleibt. Wenn's mal fuinktioniert, kann man später noch
optimieren.

Es kommt immer auf die konkreten Anforderung an.
Am besten "aufmalen", welche (Teil-) Felder man wohin bewegen will,
welche bleiben sollen.

Autor: Geri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi!


Das ist die zeiele:

port_w=~((1 << wahlp3) | (1 << (wahlp4+4)));

das ist eigentlich alles was ich jemals wollte

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
port_w=~((1 << wahlp3) | (1 << (wahlp4+4)));
besser:
port_w=~((1 << wahlp3) | (16 << (wahlp4)));
so muss er weniger schieben

noch besser:
port_w=~((16 << wahlp4) | (1 << (wahlp3)));
so muss er weniger (um)denken - der Mensch, der die oberen Bits lieber
links sieht  (-;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.