www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bitmanipulation allgemein


Autor: Peter Pippinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Newsgroup!

Ich hätte da mal ne Frage zur Bitmanipulation:

gegeben seien 2 Binärwerte:

w1 = 11111111b
w2 = 01011000b

Ok. Jetzt möchte ich gerne (nur) die Bits 1-4 und 8 von w2 mit w1 so 
verknüpfen, dass
w1 = 01111000b
ergibt

Wie löst man sowas am effektivsten? Mir fällt dazu nur ein, die 
gewünschten Bits einzeln durchzugehen und zu verknüpfen. Zozusagen eine 
Bitweise Kopie von w2 nach w1. Ist das richtig, oder gehts auch 
eleganter?

Autor: Michele B.. (luxx) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähm, deine problembeschreibung blick ich nicht ganz, was willst du genau 
mit den bits in w1 und w2 machen, das bitmuster in w1 aber nur bits 
1,2,3,4,8 sollen verwendet werden und was soll dann passieren?

Autor: Peter Pippinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also im Grunde gehts um Folgendes:

mein uC hat ein paar Ausgänge. Davon brauche ich 6-7 Stück für mein LCD. 
Nachdem das Ganze durch wiederverwendbaren Code realisiert werden soll, 
so dass man den Code auch auf nem uC verwenden kann, wo nur andere 
Ausgänge frei sind, möchte ich halt irgendwo definieren, welche Pins 
verwendet werden sollen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Pippinger wrote:
> Hallo Newsgroup!
>
> Ich hätte da mal ne Frage zur Bitmanipulation:
>
> gegeben seien 2 Binärwerte:
>
> w1 = 11111111b
> w2 = 01011000b
>
> Ok. Jetzt möchte ich gerne (nur) die Bits 1-4 und 8 von w2 mit w1 so
> verknüpfen, dass
> w1 = 01111000b
> ergibt

Das ergibt keinen Sinn.
Welche Verknüpfung soll das sein?
Welche Eigenschaften soll das Ergebnis haben? Beschreib das
doch mal genauer, zb Im Ergebniss soll ein Bit genau dann 1
sein, wenn ..... (hier dann deine Erleuterung)

> Wie löst man sowas am effektivsten?
Indem man die Bitoperationen & (UND) bzw. | (ODER) oder
Kombinationen davon auf alle 8 Bit gleichzeitig anwendet,
so dass sich das Gewünschte ergibt.

Autor: Peter Pippinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das ergibt keinen Sinn.
>Welche Verknüpfung soll das sein?
>Welche Eigenschaften soll das Ergebnis haben? Beschreib das
>doch mal genauer, zb Im Ergebniss soll ein Bit genau dann 1
>sein, wenn ..... (hier dann deine Erleuterung)

w2 soll die Quelle der Bits sein.
w1 soll das Ziel für die Bits aus w1 sein.

Es sollen aber nur ausgewählte Bits von w2 nach w1 "kopiert" werden.

Autor: Peter Pippinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, so muss es lauten:

w2 soll die Quelle der Bits sein.
w1 soll das Ziel für die ausgewählten Bits aus w2 sein.

Es sollen aber nur ausgewählte Bits von w2 nach w1 "kopiert" werden.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Pippinger wrote:
> Sorry, so muss es lauten:
>
> w2 soll die Quelle der Bits sein.
> w1 soll das Ziel für die ausgewählten Bits aus w2 sein.
>
> Es sollen aber nur ausgewählte Bits von w2 nach w1 "kopiert" werden.

Das ergibt immer noch keinen Sinn.

Ich interpretiere mal frei:

w2 ist eine Maske. Überall dort wo in w2 eine 1 steht,
soll das Bit aus w1 in das ergebnis unverändert übernommen
werden. Überall dort wo in w2 eine 0 steht soll auch im
Ergebnis eine 0 sein.

Das ist dann eine UND Verknüpfung, denn

  A   B   |  A und B
 ---------|----------
  0   0   |     0
  1   0   |     0
  0   1   |     0
  1   1   |     1

Nur in den Zeilen in denen B eine 1 aufweist, ist das Ergebnis
identisch zum Zustand von A. Überall dort wo B 0 ist, ist auch
das Ergebnis auf jeden Fall 0

Werden in C zwei Bytes (unsigned char) mit den Bitoperationen
verknüpft, dann wird diese Bitoperation auf alle 8 Bits
unabhängig voneinander angewandt:

in deinem Fall

   w1 = 0b11111111;
   w2 = 0b01110000;

   res = w1 & w2;


Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

1. : Bits werden von 0..7 numeriert.

2. (w1 AND 0b10001111) OR (w2 AND 0b01110000)

MfG Spess

Autor: Peter Pippinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube ich habe jetzt, was ich möchte:

mask  = 01110000b (invers maske)
w1    = 11111111b
------------------
&     = 01110000b  = res1

mask  = 10001111b (maske)
w2    = 01011000b
------------------
&     = 00001000b  = res2

res1  = 01110000b
res2  = 00001000b
------------------
&     = 01111000b  = ergebnis

kann man das so machen?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ja. Entschuldige ich hatte dein w1 und w2 verwechselt.

MfG Spess

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
res1 | res2 muß es heißen.
oder so: w1=(w1&0111000b)|(w2&10001111b)

Cheers
Detlef

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.