mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Anfängerfragen zu Bitmanipulationen


Autor: Florian Bruhin (the-compiler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe zwei Fragen zu Bitmanipulation in C:

1.

Ich will einfach nur in einem Byte alle Bits eins nach links schieben 
und rechts mit einem Null ausfüllen. Also z.B.:
aus 0b11110111
wird 0b11101110
das ganze dann auch noch in die andere Richtung :)

2.

Ich will aus einem Byte das Bit Nr. n extrahieren.
z.B. aus 0b11010101 will ich das Bit Nr. 3 und bekomm da ein 1.


Das ganze in C ;)

Flo

Autor: Michael Kentschke (mad_axe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das ganze in C ;)
>


Das ganze hier http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Autor: Moritz E. (devmo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Compiler Error (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>z.B. aus 0b11010101 will ich das Bit Nr. 3 und bekomm da ein 1.
Von wo fängst du an zu zählen?

Habe mal eine Funktion geschrieben die jedes beliebige Bit auf 1 oder 0 
testet. Müsste aber danach suchen. War für eine serielle Datenausgabe 
für 24 Bit.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Habe mal eine Funktion geschrieben die jedes beliebige Bit auf 1 oder 0
> testet
Wer schreibt denn für soetwas eine Funktion? ist ja wie eine funktion 
für "IF" zu schreiben

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wer schreibt denn für soetwas eine Funktion? ist ja wie eine funktion
>für "IF" zu schreiben
#define  IF   WENN


;-)

Autor: Blob! (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>1.
>Ich will einfach nur in einem Byte alle Bits eins nach links schieben
>und rechts mit einem Null ausfüllen. Also z.B.:
>aus 0b11110111
>wird 0b11101110
>das ganze dann auch noch in die andere Richtung :)

variable >>= 1;
variable <<= 1;

oder aber (je nachdem ob Du überschreiben oder kopieren möchtest:
variable1 = varialbe2 << 2;



>2.
>Ich will aus einem Byte das Bit Nr. n extrahieren.
>z.B. aus 0b11010101 will ich das Bit Nr. 3 und bekomm da ein 1.

variable = 0100101101b;
variable &= 0x04;   // du musst hier bei der hexzahl das bit setzen 
welches du brauchst, hier das 3. bit!

oder aber bi einer Abfrage:

if (variable & 0x04)

bzw. bei mehreren bits:
if ((variable & 0x05) == 0x05){ // hier das dritte und das erste bit

soweit verstanden?

Autor: Marcus Overhagen (marcus6100)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>2.
>Ich will aus einem Byte das Bit Nr. n extrahieren.
>z.B. aus 0b11010101 will ich das Bit Nr. 3 und bekomm da ein 1.

wert = 0b11010101;
n = 3;

bit = (wert >> (n-1)) & 1;

Du solltest ggf. mal überlegen, 0 basiert zu zählen.

Autor: Analog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder:

Wert=0b1010 0101


shift links: Wert=Wert*2;
shift rechts:Wert=Wert/2;


:)

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian Bruhin wrote:
> Hallo,

Hi Flo,
> 1.
>
> Ich will einfach nur in einem Byte alle Bits eins nach links schieben
> und rechts mit einem Null ausfüllen. Also z.B.:
> aus  0b11110111
> wird 0b11101110
> das ganze dann auch noch in die andere Richtung :)

uint8_t byte;

kannst Du schreiben
byte << 1
und byte >> 1

> Ich will aus einem Byte das Bit Nr. n extrahieren.
> z.B. aus 0b11010101 will ich das Bit Nr. 3 und bekomm da ein 1.
>
>
> Das ganze in C ;)

Da benutzt Du eine Maske: byte & (1 << 2)

Gruss,
Michael

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>shift links: Wert=Wert*2;
>shift rechts:Wert=Wert/2;

wobei eine multiplikation bzw. eine Divison deutlich länger dauert als 
ein shift, desweiteren funktioniert das nur bei einmal shiften, wenn man 
3 oder 4 mal schieben will klappt das nicht mehr!

deswegen eben der shiftbefehl >> bzw <<

@Florian
Wenn Du einfach auf != 0 abfrägst ist die einfachste Lösung eine 
Bitmaske zu benützen, also verunden mit entsprechendem hex-wert

wenn Du aber exakt den Wert 1 benötigst musst Du zuvor nochmal um die 
stellen schieben wie oben schon beschrieben, ist aber oft  nicht 
nowendig weil einfache if-Abfragen eben nicht auf ==1 sondern auf !=0 
prüfen, deswegen funktioniert das oben beschriebene if (wert & 0x04) mit 
jedem Bit, also auch mit 0x05, 0x03 ...

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
>>shift links: Wert=Wert*2;
>>shift rechts:Wert=Wert/2;
>
> wobei eine multiplikation bzw. eine Divison deutlich länger dauert als
> ein shift, desweiteren funktioniert das nur bei einmal shiften, wenn man
> 3 oder 4 mal schieben will klappt das nicht mehr!

Unsinn, natuerlich funktioniert das. Man kann allerdings nur mit 
Potenzen von zwei Multiplizieren bzw. Dividieren.

Autor: Analog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das war ja auch nur ein Spaß. Aber wenn der Compiler gut ist, macht er 
einen shift daraus.

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.