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
>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.
> 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
>Wer schreibt denn für soetwas eine Funktion? ist ja wie eine funktion >für "IF" zu schreiben
1 | #define IF WENN
|
;-)
>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?
>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.
Oder: Wert=0b1010 0101 shift links: Wert=Wert*2; shift rechts:Wert=Wert/2; :)
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
>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 ...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.