Forum: PC-Programmierung Validierung der Position einer Bitmaske


von Thomas (Gast)


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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

1
input (x)
2
if x == 0
3
    print "keine Maske vorhanden"
4
else
5
    y := x XOR (x AND (x-1))
6
    z := log2 (x)
7
    print "Bitposition = " + z

von Thomas K. (kalka)


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

von Malte S. (maltest)


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.

von Thomas (Gast)


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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Was spricht den dagegen das einfach "rauszuschieben" und bei jeder 1 
eine Ausgabe zu machen (oder was auch immer du mit dem Ergebnis vor 
hast).

von Malte S. (maltest)


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.

von Thomas (Gast)


Lesenswert?

Mist es liegt wirklich an mir ;-)

Sorry ich hab diese Codezeile glatt übersehen. Vielen Dank an Alle für 
die freundliche Mithilfe! :)

Grüsse

von Yalu X. (yalu) (Moderator)


Lesenswert?

Johann L. schrieb:
> y := x XOR (x AND (x-1))

Nur des Senfs wegen:

Das lässt sich vereinfachen zu
1
y := x AND NOT (x-1)

Wird im Zweierkomplement gerechnet, wird daraus
1
y := x AND -x

von Malte S. (maltest)


Lesenswert?

Danke! Wunderschön!

von Robert L. (lrlr)


Lesenswert?

ich wäre auch für die  Läubi "methode"

(LOG ist ja wohl etwas übertrieben)

von Johann L. (gjlayde) Benutzerseite


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.

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
Noch kein Account? Hier anmelden.