Verwirrung bei AND und BitAnd

  • Ich weiß, das ist hier vielleicht falsch eingeordnet und es ist auch nix wichtiges, aber ich versteh da grade etwas nicht:

    Es gibt ein AND und eine Funktion BitAND.
    Ich habe nun ein Script gefunden, mit dem ich Rechte auslesen kann. Diese kommen in einem Objekt zurück
    - allerdings als Bitmaske! Das heißt, diese muss man dann durch logische Und-Verknüpfungen auswerten.
    Heißt eigentlich in meinen Augen BitAND. Allerdings wird in dem Script einfach ein AND verwendet.

    Ich glaub ich poste hier einfach mal ein Beispiel:

    [autoit]


    Local $recht = 0x00100001 ;Daten lesen-Recht
    Local $ausgelesen = 0x001F01FF ; -> Bsp: User hat Vollzugriff

    [/autoit][autoit][/autoit][autoit]

    ;übliche Verwendung AND
    If $ausgelesen = 0x001F01FF AND $recht = 0x00100001 Then
    ;schreib irgendeine komische Abfrage
    EndIf

    [/autoit][autoit][/autoit][autoit]

    ;Meine Vorstellung das Bitmuster auszulesen
    If BitAND($recht,$ausgelesen) = $recht Then
    ;schreib das Recht
    EndIf

    [/autoit][autoit][/autoit][autoit]

    ;Gezeigte Form des Auslesens:
    If $recht AND $auslesen Then
    ;schreib: hat ...recht
    EndIf

    [/autoit]

    Ich verstehe jetzt die Verwendung von dem AND in der letzten Form nicht.... Wie ist das zu verstehen? Der Script funktioniert wie er soll .. nur ich würd gern kapieren, warum ! ?( Ich denke, die Erklärung wird total einfach sein, nur stehe ich grad irgendwie total auf dem Schlauch!

    Eigentlich bedeutet die letzte Aussage doch nix anderes als:
    Wenn {hexzahl} und {hexzahl} dann tue....
    Aber eigentlich bräuchte man zwischen dem if and und then doch True oder False... ?!??

    Hoffe, die Frage is euch nicht zu doof.... aber hab schon versucht über die Hilfe und hier im Forum was zu finden...
    bisher erfolglos...

    Danke,
    Joerdis

    Einmal editiert, zuletzt von Joerdis (28. August 2009 um 11:33)

    • Offizieller Beitrag

    Du hast hier zwei Sachen:
    Einmal werden zwei einzelne Variablen auf Inhalt geprüft und wenn bei beiden der Inhalt stimmt ist die If-Abfrage wahr:
    If Var1=Wert1 AND Var2=Wert2 Then
    Das AND verknüpft nur die Bedingungen.

    Ein anderes mal hat man eine Variable, die mehrere Bitwerte trägt. Mit BitAND wird geprüft, ob ein Vergleichswert enthalten ist:
    If BitAND(Var, Vergleichswert) Then

    PS: Schau mal in meine Signatur - Bit-Tut

    Edit:
    Hier mal für dein Bsp.:

    [autoit]

    Local $recht = 0x00100001 ;Daten lesen-Recht
    Local $ausgelesen = 0x001F01FF ; -> Bsp: User hat Vollzugriff

    [/autoit][autoit][/autoit][autoit]

    Local $sumRechte = BitOR($recht,$ausgelesen)

    [/autoit][autoit][/autoit][autoit]

    If BitAND($sumRechte, $recht) Then ; Daten Lesen
    If BitAND($sumRechte, $ausgelesen) Then ; Vollzugriff

    [/autoit]
  • Ich hab das so verstanden, dass BitAND eine Zahl zurückgibt...

    Beispiel aus deinem Tutorial:

    [autoit]

    $CheckSum = 10
    If BitAND ( $CheckSum, 2 ) Then

    [/autoit]


    10: 1010
    02: 0010
    -----------
    02: 0010 <- Rückgabewert von BitAnd

    also steht eigentlich nur da:
    If 2 Then <- versteh ich nicht???

    Steh ziemlich auf dem Schlauch, weil ich nicht vertsehe warum ausgerechnet in einer If-Abfrage das BitAnd einen booleanwert zurückgeben sollte....
    Das einzige was ich verstehe is, dass natürlich 0 zurückkommt, wenn keine Übereinstimmung vorliegt... aber das hilft ja noch nicht....

    Bsp:
    BitAnd(10,9)
    10:1010
    09:1001
    -----------
    08:1000 <- Nich null, aber trotzdem falsch!! .. ??

    Wo is mein Denkfehler?

    • Offizieller Beitrag

    Steh ziemlich auf dem Schlauch, weil ich nicht vertsehe warum ausgerechnet in einer If-Abfrage das BitAnd einen booleanwert zurückgeben sollte....


    Der Booleanwert ist nicht wirklich da. :)
    Wenn die Abfrage ohne Ergebnis ist, wird 0 zurückgegeben und das wird in AutoIt ebenso wie False interpretiert. Jeder Wert größer Null ist in der Interpretation True.
    Somit kann man Abfragen, bei denen der Rückgabewert vordergründig nicht weiter genutzt wird, zur besseren Übersicht einfach als Boolean nutzen.

    BitAnd(10,9) <== Hier gilt doch, dass 9 als Bitwert nicht in 10 enthalten ist - also falsch.
    Oops, ich sollte selber öfter mein Tut lesen, da war ich daneben. :D

  • BitAnd(10,9) <== Hier gilt doch, dass 9 als Bitwert nicht in 10 enthalten ist - also falsch.

    Aber BitAND(10,9) sollte nach meinem Verständnis 8 zurückliefern -> also True, oder??????

    denn wenn mann (1010)2 mit (1001)2 logisch und-verknüpft kommt (1000)2 raus, also (8)10

    Oder sehe ich das falsch? BitAnd setzt doch ein Und für jede position.... ????

    irgendwas stimmt da in meinem Verständnis anscheinen nicht. 8| Kannst du mir das erklären??? bitte...

    • Offizieller Beitrag

    :D
    Da war ich jetzt auf dem falschen Dampfer. Wenn der Vergleichswert kein Dualwert ist, ergibt sich als Ergebnis der Dualwert, der sowohl in Summe als auch Vergleichswert enthalten ist. In diesem Fall 8 - und somit hast du recht.
    Ich war etwas daneben, da ich als Vergleichswerte ausschließlich eigenständige Dualwerte verwende, sonst ist ja die Boolsche Abfrage nicht eindeutig. Denn BitAND(10,9) und auch BitAND(10,2) liefern True.

  • Ok... soweit verstanden aber jetz nochmal kurz die Frage:

    kann mal also

    [autoit]

    If BitAND($rechte, $ausgelesen) Then

    [/autoit]


    als

    [autoit]

    If $rechte AND $ausgelesen Then

    [/autoit]


    interpretieren?
    Liefert das dieselben Ergebnisse???
    Aber eig. kann das nicht sein, weil dann der Script fehlerhaft laufen würde, es aber nicht tun. Warum liefert:

    [autoit]

    If $rechte AND $ausgelesen Then

    [/autoit]


    nur dann 0, wenn $rechte nicht vollständig in $ausgelesen enthalten ist?

    Edit: Anmerkung dazu: die Rechte haben an einem Punkt alle den gleichen bitwert und an späterer Stelle unterscheiden sie sich... (Es sind 32Bit-Werte...) Also müsste BitAnd immer einen "true" wert liefern....
    Aber im Script scheint die AND variante das nicht zu tun ... warum?

    • Offizieller Beitrag

    If $rechte AND $ausgelesen Then


    Das bedeutet ja nur, dass irgendein Wert > 0 in diesen Variablen ist. Du mußt aber schon prüfen, ob der richtige Wert enthalten ist.

    "If BitAND($rechte, $ausgelesen) Then"
    Ob das geht, kann ich nicht sagen. Ich weiß ja nicht, wie die Rechtefestlegung codiert ist. Wenn $ausgelesen als Bitwert in $rechte mit BitOr verknüpft wurde, kann man das so auch abprüfen.

  • OK, die AND verknüpfung erzeugt also den selben Fehler....

    Der Script scheint also nur zufällig die richtigen Werte aus *komisch* :evil:

    Aber auf jeden Fall Danke für die hier gelassenen Nerven. Ich glaub ich habs jetz kapiert :D

    Ich muss das alles ordentlich über

    [autoit]

    If BitAND($recht,$gelesen)=$recht Then ...

    [/autoit]


    abfangen.

    thx, Joerdis :thumbup: