Frage zu Bitmanipulation

Hallo,

wie kopiert man die Bits 0-6 eines Bits an die Bits 0-6 eines unsigned longs, ohne dass sich die oberen (linken) Bits des unsigned longs ändern?

Pseudocode:

byte basis = B01101101;
unsigned long target = 0xFF00FFFF;

void setup()
{
}

void loop()
{
}

Ergebnis soll sein:

unsigned long target == FF00FFED;

Gruß Chris

Erst die entsprechenden Bits mit einem UND mit 0 löschen. Dann eventuell das oberste Bit des neuen Werts auch auf 0 setzen wenn das nicht schon der Fall ist. Dann mit dem neuen Wert verordern.

Wenn du z.B. && 0xFFFFFF00 machst, wird das unterste Byte auf 0 gesetzt. Bei 7 Bits willst du && 0xFFFFFF80 wenn ich es richtig sehe

Chris72622:
wie kopiert man die Bits 0-6 eines Bits an die Bits 0-6 eines unsigned longs, ohne dass sich die oberen (linken) Bits des unsigned longs ändern?

In Langform zum Verstehen mit Kommentaren:

  // die niederwertigsten 7 Bits löschen durch Rechtsschieben und Linksschieben
  target= (target>>7)<<7; 
  // Und dann eine bitweise Oder-Verknüpfung anwenden
  target= target | basis;

Das kann man aber auch als Einzeiler schreiben.

Nachtrag: Kleine Korrektur “Bits 0-6” sind ja sieben Bits.

Ok, das geht natürlich auch.

Bei dem Oder muss man aber aufpassen was im obersten Bit von “basis” steht! Das muss auch 0 sein damit man nicht das oberste Bit des Ziels überschreibt.

EDIT:
grr auch falsch gezählt. Es man muss nur beim obersten Bit aufpassen. Das ist in den Beispiel 0, aber je nach Anwendung eventuell nicht immer

Serenifly:
Bei dem Oder muss man aber aufpassen was in den oberen 2 Bits von "basis" steht! Die Bits müssen auch 0 sein damit sie nicht die Bits 7 und 8 des Ziels überschreiben.

Gerade gesehen und in meinem vorherigen Posting korrigiert: Er möchte 7 Bits setzen ("Bits 0-6" sind sieben Stück).
Bei dem von mir geposteten Code darf in "basis" das oberste Bit dann natürlich nicht gesetzt sein.
Wenn es doch gesetzt sein kann und nur 7 Bits gesetzt werden sollen, müßte noch das oberste Bit gelöscht werden, bevor die Oder-Verknüpfung durchgeführt wird. Mein Code ist dafür vorgesehen, dass in "basis" das höherwertigste Bit nicht gesetzt ist. Aber das könnte man ja leicht modifizieren.

Das habe ich gerade auch gemerkt als ich dein Post gesehen habe :frowning: Peinlich :frowning:

Habe es mal angepasst

Topp!

Gruß Chris

ist ja fürchterlich ! kann denn hier keiner zählen ?

:stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue:

Offensichtlich nicht

Eisebaer:
ist ja fürchterlich ! kann denn hier keiner zählen ?

:stuck_out_tongue: :stuck_out_tongue: :stuck_out_tongue:

Kann mich nicht dazu äusern; Hab nicht mitgezählt. :wink: :wink: :wink: :wink:
Grüße Uwe

Ach…

ihr wisst doch,

There are just ‘IO’ types of people, ‘I’ understand Logic, ‘I’ don’t…

Greetz
(gerade aus Japan…)
Linpotec