[Mini-Tutorial] BitOR und Konsorten.

  • (Anfängertutorial)

    BitOR(6, 4) = 2 - aber was heißt das? Es ist mehr eine Geschichts-Stunde über: Frauen - und Mr. Booleans Mangel selbiger. Boolean lebte vor langer Zeit (wann genau interessiert eigentlich nicht). Er sah alle anderen Mathe-Genies der Zeit, wie sie "coole" neue Dinge entdeckten, zu Ruhm und Reichtum und damit auch ... Frauen kamen. Boolean dachte sich also: "Das will ich auch!" und begann zu forschen und zu theoretisieren. Der Hellste war er in diesem Gebiet nicht und stieß deswegen auch auf keine neue Formel oder ein neues Theorem. Also schmiss er alles übern Haufen und erschuf kurz und gut seine eigene Mathematik. Seine größten Forschungsergebnisse waren: Wahrheitstabellen! Hier ein Beispiel:

    Code
    A = TRUE
    B = FALSE
    
    
    A AND B = B, weil nicht beide wahr sind, ist das Ergebis falsch, also B
    A OR B = A, weil eines von beiden wahr ist, ist das Ergebnis auch wahr, also A
    B OR B =B, nichts von beiden ist wahr, also ist das Ergebnis falsch, also B

    Eigentlich ziemlich primitiv! Jeder dachte es wäre supergenial und innovativ, dabei hatte es absolut keinen Nutzen zu seiner Zeit. "Oh cool, A and B = A, wow!" Das war so ziemlich alles was man damit anfangen konnte, das Eis berechen auf Partys. Boolean brauchte sich aber nicht weiter um die Anwendung seiner Erfindung zu kümmern, denn er hatte bereits alles was er wollte und starb glücklich und zufrieden.

    Wenn man es auf des Pudels Kern runterbricht, dann kann ein Computer nichts anderes als bool'sche Mathematik. Addition ist eigentlich nur komplexeres Vergleichen und alle anderen Rechenoperationen sind ebenfalls komplexere Additionen. Computer kennen nur zwei Zustände: 1 und 0, die WAHR und FALSCH darstellen. Hunderte Jahre nach seinem Tod erfährt Booleans Werk endlich einen Zweck ( ;) ).

    0 und 1 sind die zwei Zustände des binären Zahlensystems. Der Computer muss also alle Zahlen, die verglichen werden sollen ins binäre System umrechnen und dann jede Ziffer mit der korrespondierenden vergleichen (Bitwise). Binär? Beispiel:

    In AutoIt sind wichtig: BitOR(), BitXOR() und BitAND().

    Code
    x AND y : x UND y müssen beide WAHR sein, damit das Ergebis WAHR ist
    x OR y  : ENTWEDER x ODER y muss WAHR sein, damit das Ergbenis WAHR ist. Es können auch 
    BEIDE WAHR sein, damit die Aussage WAHR ist!
    x XOR y : ENTWEDER x ODER y muss WAHR sein, damit das Ergbenis WAHR ist. Es dürfen 
    nicht BEIDE WAHR sein, sonst ist die Aussage FALSCH!

    So, mehr musst du nicht wissen. Wir können trotzdem nochmal 2 Beispiele durchgehen:

    Beispiele hier unten

    Einmal editiert, zuletzt von minx (30. März 2013 um 09:23)

  • Hi,
    schön erklärt, jetzt fehlt nur noch die ANWENDUNG dafür^^
    Also den Fall, wieso man überhaupt ein AND,OR, oder gar ein XOR benötigt :D

  • Das soll ja nur für die Grundlagen sein. Vielleicht mache ich später mal ne Fortsetzung (Bau eines Voll-Addierers als Fortsetzung zu der Computer-Theorie).

    Einmal editiert, zuletzt von minx (29. März 2013 um 21:52)

  • Naja, ein Volladdierer ist ja nicht unbedingt der Sinn und Zweck für die Bit-Operationen.

    So in etwa meine ich das:
    BitAnd wird u.a. verwendet, um vollständige Übereinstimmung der gesetzten Bits zu überprüfen

    Spoiler anzeigen
    [autoit]

    $a = 3 ;00000011
    $b = 11 ;00001011
    ;sind alle Bits von $a auch in $b gesetzt?
    $erg = BitAND($a, $b)
    If $erg = $a Then
    MsgBox(0, "BitAnd", "Die Bits von " & $a & " sind auch in " & $b & " alle gesetzt")
    Else
    MsgBox(0, "BitAnd", "Die Bits von " & $a & " sind in " & $b & " alle oder teilweise nicht gesetzt")
    EndIf

    [/autoit]
  • Zitat

    Naja, ein Volladdierer ist ja nicht unbedingt der Sinn und Zweck für die Bit-Operationen.


    Aber klar! Grundlagen-Aufbau eines Rechners, der "Urzweck" der bool'schen Mathematik :P . In Verbindung mit AutoIt ist dein Beispiel sinnvoller ^^

  • Beispiel für XOR

    [autoit]

    ;Verschlüsselung oder andere Anwendungen s. http://de.wikipedia.org/wiki/XOR-Gatter

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

    $nachricht=122567
    $schluessel=7712

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

    $geheimtext = bitxor($nachricht,$schluessel)
    MsgBox(0,"Verschlüsselung mit BitXOR","Nachricht "&$nachricht&" verschlüsselt mit Schlüssel "& $schluessel&" ergibt Geheimtext "&$geheimtext)

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

    $nachricht = bitxor($geheimtext,$schluessel)
    MsgBox(0,"Entschlüsselung mit BitXOR","Geheimtext "&$geheimtext&" entschlüsselt mit Schlüssel "& $schluessel&" ergibt Nachricht "&$nachricht)

    [/autoit]


    Beispiel für OR

    [autoit]

    ;Filtern von bspw. Funktionsparametern oder Konstanten
    $Parameter0=7
    $Parameter1=11
    $Parameter2=19
    $Parameter3=35
    $Parameter4=67
    $Parameter5=131

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

    ;einige Parameter zusammenfassen in eine Zahl mittels OR, um nur eine Zahl statt mehrerer in eine Funktion oder DLL zu übergeben
    $or=bitor($Parameter4,$Parameter2,$Parameter0,$Parameter5) ;Reihenfolge egal
    msgbox(0,"BitOR","Zusammenfassung der ausgewählten Parameter in eine Zahl= "&$or)

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

    ;Parameter aus OR herausdröseln
    ;$or =16 zum testen auskommentieren, es wurden ungültige Parameter übergeben
    $para=""
    for $i=0 to 6
    if bitand($or,3)<>3 then exit(msgbox(0,"BitOR","Ungültige Parameterübergabe!!!")) ;abfrage in der Funktion, ob valide Parameter übergeben wurden
    if bitand($or,2^($i+2)+3)=2^($i+2)+3 then $para&="Parameter"&$i&@crlf
    Next
    msgbox(0,"BitOR","Es wurden die "&@crlf&$para&@crlf&"mit BitOR verknüpft")

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (29. März 2013 um 23:05)

  • Oscar ,
    du hast Recht.
    Das dafür genutzte Carryflag kann imho von AutoIt nicht ausgewertet werden, Über- und Unterläufe muss man daher schon vorher abfangen, was die gesamte gewonnene Performance auffrisst.

  • Also ich finde ja BitShift sehr interessant (schnelles verdoppeln/halbieren)


    Nicht nur halbieren und Verdoppeln - alle Multiplikationen und Divisionen mit Zweierpotenzen (halt aber nur Integer) kann man damit ersetzen.
    Allerdings ist das in AutoIt leider nicht schneller als die direkten Divisions und Multiplikationsoperatoren (Ebenso beim Modulo mit Bitshift)
    Wahrscheinlich weil die Bitoperationen in AutoIt als Funktionen implementiert sind und dafür der entsprechende Overhead entsteht.