Validierung der Position einer Bitmaske

Gast #3071957
Lesenswert?

Hei Leute

Ich habe ein Problem mit Bitmasken, dass ich irgendwie nicht auf die 
Reihe kriege. Gibt es eine Möglichkeit, unabhängig von einer Sprache, 
festzustellen an welcher Position eines Bitstrings eine Maske ansetzt?

Hier ein Beispiel dass das Verständniss decken sollte:
    01001011 Wert
AND 00001000 Bitmaske
-------------
=   00001000 Ergebnis
        ^    Hier setzt die Maske an.

Wie kann ich diese Position ausmachen?

Vielen Dank schon im voraus für eure Hilfe.

Gruss

Thomas
#3071982
Lesenswert?

Hey,

du möchtest also die Position des Bits bestimmen? z.B. 0b0000.0001 wäre 
die Position 1, 0b0000.0010 die Position 2. Wenn du die Zahlen als 
Dezimalzahl darstellst, ergiben sich Werte von 1,2,4,8,16,32,64 oder 128 
(bei 8 Bit). Das entspricht
wobei N die Position des Bits ist.

Um nun das N zu ermitteln wendest du "einfach" den Logarithmus an
wobei X die Dezimalzahl darstellt. Das ist natürlich jetzt eine eher 
mathematische Lösung.

Viele Grüße,
  Thomas
#3072005
Lesenswert?

Thomas K. schrieb:
> Um nun das N zu ermitteln wendest du "einfach" den Logarithmus anwobei X die 
Dezimalzahl darstellt. Das ist natürlich jetzt eine eher
> mathematische Lösung.

Ja, aber genau die richtige. Nachdem vorher sichergestellt ist, dass der 
Wert, auf den Du den Logarithmus anwendest, genau dieses eine unterste 
Bit gesetzt hat. Das macht Johanns Beispiel, wenn auch:
>    y := x XOR (x AND (x-1))
>    z := log2 (x)
                ^^ nicht y?

Prägnanter geht's wohl nicht.
Gast #3072019
Lesenswert?

Hei Nochmal :)

Die Idee mit dem Logarithmus hatte ich ebenfalls. Nur muss ich 
feststellen
dass es nicht möglich ist wenn die Bitmaske mehrere Werte definiert also 
beispielsweise sowas:

    01001011 Wert
AND 01001000 Bitmaske
-------------
=   01001000 Ergebnis
     ^  ^    Hier setzt die Maske an.

Möglicherweise liegt der Fehler auch an mir aber funktioniert der Trick 
mit der Logarithmie nicht mehr oder?

Grüsse

Thomas
#3072043
Lesenswert?

Richtig erkannt. Dafür sorgt die Zeile mit dem and und xor.

    01001011 Wert
AND 01001000 Bitmaske
-------------
=   01001000 Ergebnis
     ^  ^    Hier setzt die Maske an.

    01001000 Dein Ergebnis
AND 01000111 Dein Ergebnis - 1
-------------
=   01000000 niedrigstes Bit wurde gelöscht. Bitmanipulation
XOR 01001000 Dein ursprüngliches Ergebis
-------------
=   00001000 Nur noch das niedrigste Bit des ursprünglichen Ergebnisses

DAS ist immer eine glatte Zweierpotenz.
Persönliche Seite #3073003
Lesenswert?

Malte S. schrieb:
> Thomas K. schrieb:
>> Um nun das N zu ermitteln wendest du "einfach" den Logarithmus an
>> wobei X die Dezimalzahl darstellt. Das ist natürlich jetzt eine
>> eher mathematische Lösung.
>
> Ja, aber genau die richtige. Nachdem vorher sichergestellt ist, dass der
> Wert, auf den Du den Logarithmus anwendest, genau dieses eine unterste
> Bit gesetzt hat. Das macht Johanns Beispiel, wenn auch:
>>    y := x XOR (x AND (x-1))
>>    z := log2 (x)
>                 ^^ nicht y?
>
> Prägnanter geht's wohl nicht.

Ja, muß y heißen.

Robert L. schrieb:

> LOG ist ja wohl etwas übertrieben

Was ist an einer mathematischen Funktion "übertrieben"?

Einfacher als log geht's ja wohl kaum :-) Die Frage war ja explizit 
nicht bezüglich einer Programmiersprache.

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