Anfängerfragen zu Bitmanipulationen

OP #1104160
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
Gast #1104226
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.
Gast #1104242
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?
Persönliche Seite #1104395
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
Gast #1104450
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 ...
Persönliche Seite #1104553
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren