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
> Das ganze in C ;) > Das ganze hier http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Gast
#1104226
>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
#1104233
> 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
#1104240
>Wer schreibt denn für soetwas eine Funktion? ist ja wie eine funktion >für "IF" zu schreiben
1 | |
;-)
Gast
#1104242
>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.
Gast
#1104392
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
Gast
#1104450
>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.
Gast
#1104599
Das war ja auch nur ein Spaß. Aber wenn der Compiler gut ist, macht er einen shift daraus.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.