Forum: Mikrocontroller und Digitale Elektronik Bitmanipulation


von Geri (Gast)


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

von Bernhard S. (bernhard)


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

von TravelRec. (Gast)


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

von GeRi (Gast)


Lesenswert?

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

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

von ulrich (Gast)


Lesenswert?

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

von Simon Küppers (Gast)


Lesenswert?

ganz ehrlich? man müsste erstmal verstehen was du vor hast...

von GeRi (Gast)


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

von peter zerl (Gast)


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

von Geri (Gast)


Lesenswert?

danke für die nützlichen tipps!

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



Danke!

von Marcus (Gast)


Lesenswert?

aha... und wie?

von peter zerl (Gast)


Lesenswert?

würd mich jetzt auch interessieren

von Kai R. (kairiek)


Lesenswert?

Jupp,

ZEIGEN!!!

Muss ja dann wohl sehr einfach gewesen sein...

von Conlost (Gast)


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

von Klaus (Gast)


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.

von Geri (Gast)


Lesenswert?

hi!


Das ist die zeiele:

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

das ist eigentlich alles was ich jemals wollte

von Profi (Gast)


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  (-;

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.