Anfängerfragen zu Bitmanipulationen

OP #1104160
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
>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
> 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
Gast
>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
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
>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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.