Diskussion:Bitmanipulation
Betr. "8-bit-Schreibweise", wie es in meiner urspruenglichen Version bei den C-Routinen stand: Soweit mir bekannt, werden viele der genutzten Anweisungen implizit auf Integer-Datentyp konverviert (also >8bit). Daher war die Formulierung so gewaehlt. (mthomas)
Hallo Thomas, Sorry, das wusste ich nicht. Fuer mich klang "Binaerschreibweise" einfach besser. Wenn Du meinst, dass das nicht so richtig ist, dann aender's doch bitte einfach wieder. :) Danke! Gruesse, --Sym 23:43, 4. Sep 2004 (CEST)
PB0 erk�ren
Im C-Beispiel: PORTB ^= _BV(PB0); /* Ex-OR mit Bit-Wert im avr-libc-"slang" */ PORTB ^= (1<<PB0); /* Ex-OR mit universeller - sprich: Standardschreibweise */
Ist hier mit PB0 eine Variable gemeint, der man PINB zuweist oder 0b00000000 oder liege ich ganz falsch.
- PB0 ist ein #define in einem der ioxxx.h Headerfiles und ist mit "0" (0x00) zu ersetzen. Das entspricht der Stelle an dem dieses Bit steht.
bestimmte bits setzen und löschen
manchmal möchte man man in einem register bestimmte bits so setzten, wie sie in einem anderen sind.
deshalb schlage ich vor folgendes macro in den artikel mit aufzunehmen:
PORTB //das ausgangsregister
_QUELLE //die variable, welche die bits enthält, die man in das Ausgangsregister übernehmen möchte
_MASKE //eine bitmaske, nur die bits, bei denen hier ein steht werden in PORTB verändert
PORTB ^= ((PORTB ^ _QUELLE) & _MASKE);
/* PORTB ^ _QUELLE: finde die unterschiede & _MASKE: maskiere die gewünschten und toggle dann diese
kann man das noch vereinfachen? kann man das aufnehmen?
tubbu
---
neuere AVR's können Bits auch togglen indem man eine entsprechende eins an PINx schreibt.
Verwendung des Begriffs 'Bitmuster'
Nachdem am Anfang des Artikels 'Bitmaske' eingeführt wird, sollten wir vielleicht überlegen, den zweiten Begriff 'Bitmuster' zu vermeiden. Der zweite Begriff bringt zwar mehr Abwechslung rein, aber wieso unnötig einen zweiten Begriff für das gleiche einführen?
OK, aber die Beschreibung klingt sehr akademisch. Der Text richtet sich ja an Anfänger, das sollte man es doch etwas landläufiger erklären.
Fehler in Abschnitt Bits setzen - Standard C
Dort steht folgendes: reg_32 |= (1 << MEINBIT15); /* FEHLER: Setzt die Bits 31 - 15, da ((int)1 << 15) == 0xFFFF8000 */
Das ist soweit ich das sehe nicht korrekt. Sowohl (int)1 << 15 als auch (unsigned int)1 << 15 sind gleich 0x8000. Zur Info: -1 << 15 == 0xFFFF8000. Aber wir shiften ja 1, nicht -1. Der Linksshift ist soweit ich weiß unproblematisch. Problematisch ist der Rechtsshift bei signed variablen, der sich je nach Compiler etc. unterschiedlich verhalten kann. Hier wird meiner Meinung nach ein Problem angesprochen, das es nicht gibt. :)
--
Du irrst dich. Nicht das Shiften selbst ist das Problem, sondern die anschließende Erweiterung auf 32-Bit. Das Ergebnis von (1 << 15) hat den Typ int, ist also vorzeichenbehaftet. Entsprechend findet bei der Konvertierung zum 32-Bit-Typ eine Vorzeichenerweiterung statt.
(unsigned int)0x8000 -> 0x00008000
(int)0x8000 -> 0xFFFF8000
--Sternst 22:14, 18. Apr. 2013 (UTC)