Bitmanipulation

Gast #313582
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
#313583
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
Gast #313589
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
Gast #313595
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.
Gast #313597
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren