Forum: Mikrocontroller und Digitale Elektronik Anfängerfragen zu Bitmanipulationen


von Florian B. (the-compiler)


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

von Michael K. (mad_axe)


Lesenswert?

> Das ganze in C ;)
>


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

von Moritz E. (devmo)


Lesenswert?


von Compiler Error (Gast)


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.

von Peter (Gast)


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

von Matthias L. (Gast)


Lesenswert?

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


;-)

von Blob! (Gast)


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?

von Marcus O. (marcus6100)


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.

von Analog (Gast)


Lesenswert?

Oder:

Wert=0b1010 0101


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


:)

von Michael G. (linuxgeek) Benutzerseite


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

von Gast (Gast)


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 ...

von Michael G. (linuxgeek) Benutzerseite


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.

von Analog (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.