Addition mit logischen Operatoren (von Make-Grafik)

  • Hallo Community!
    Ich beschäftige mich derzeitig wieder mit logischen Operatoren. Den theoretischen Teil habe ich hinter mir, aber mich würde nun einmal wirklich interessieren, wie ich dies praktisch umsetzen kann. Dazu habe ich mir einmal angesehen, wie der PC intern addiert, subtrahiert, multipliziert und dividiert. Bis auf die Division habe ich soweit alles verstanden und möchte dieses Verfahren nur mit den Bit-Befehlen und den logischen Operatoren nachprogrammieren. Allerdings hänge ich nun bei einem logischen Problem bei der Addition. Ich schaffe es einfach nicht, die Bits mithilfe der logischen Operatoren so auszuwerten, dass einmal der Überlauf in einer Variable gespeichert wird und auch das Ergebnis an der entsprechenden Stelle selber. Als Hilfe (um auf Bit Ebene besser arbeiten zu können) habe ich mir einige Funktionen dazu geschrieben.

    Spoiler anzeigen
    [autoit]

    ; AND OR XOR IMP EQV
    ; 0011 0011 0011 0011 0011
    ; 0101 0101 0101 0101 0101
    ; ---- ---- ---- ---- ----
    ; 0001 0111 0110 1101 1001

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

    ;~ Func Add($iO, $iT)
    ;~ Local $i, $bU, $iRet

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

    ;~ For $i = 0 To 63
    ;~ $iRet = BitSet($iRet, $i, )
    ;~ $bU =
    ;~ Next

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

    ;~ Return $iRet
    ;~ EndFunc

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

    Func Xor($bO, $bT)
    Return Not ($bO And $bT) And ($bO Or $bT)
    EndFunc

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

    Func Imp($bO, $bT)
    Return Not $bO Or $bT
    EndFunc

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

    Func Eqv($bO, $bT)
    Return Not Xor($bO, $bT)
    EndFunc

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

    Func Bit($iVal, $iBit)
    Return BitAND($iVal, BitShift(1, $iBit * -1)) And True
    EndFunc

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

    Func BitSet($iVal, $iBit, $bSet)
    If $bSet Then Return BitOR($iVal, BitShift(1, $iBit * -1))
    Return BitAND($iVal, BitNOT(BitShift(1, $iBit * -1)))
    EndFunc

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

    Func BitIMP($iO, $iT)
    Local $i, $iRet

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

    For $i = 0 To 63
    $iRet = BitSet($iRet, $i, Imp(Bit($iO, $i), Bit($iT, $i)))
    Next

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

    Return $iRet
    EndFunc

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

    Func BitEQV($iO, $iT)
    Local $i, $iRet

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

    For $i = 0 To 63
    $iRet = BitSet($iRet, $i, Eqv(Bit($iO, $i), Bit($iT, $i)))
    Next

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

    Return $iRet
    EndFunc

    [/autoit]

    Mit Hilfe dieser Funktionen (Welche selber die logischen Operatoren und auch Bit-Befehle verwenden) möchte ich nun eine Addition zweier Zahlen erreichen. Insgesamt gibt es dort 8 mögliche Kombinationen. Nun geht es darum das Ergebnis heraus zu bekommen und den Überlauf (als + markiert).

    Code
    Zahl 1   -> 00001111
    Zahl 2   -> 00110011
    Überlauf -> 01010101
    --------------------
    Ergebnis -> 01101001
             ->    + +++

    Wie man hoffentlich erkennen kann, habe ich den Überlauf in meinen Überlegungen mit einbezogen.

    Hat jemand vielleicht einen Denkansatz wie ich nun dieses Problem bewältigen kann?
    Nochmal zur Erinnerung: Ich möchte eine Addition nur mit Hilfe von den logischen Operatoren und auch den Bit-Befehlen erreichen.


    LG. Make :)

    Anmerkung von James: Make hat momentan anscheinend ein paar Probleme mit dem Forum, also erstelle ich den Thread für ihn.

    AutoIt Version (Prod): 3.3.14.2

    AutoIt Version (Beta): 3.3.9.5

    ausgewählte Skripte: Chatbot, komplexe Zahlen (UDF)

    Einmal editiert, zuletzt von James (28. August 2013 um 22:19)

  • Hier mal meine Lösung. Ich habe zwar nicht deine Funktionen verwendet, hoffe aber, dass es trotzdem verständlich ist. Negative Zahlen als Ergebnis sind noch ein Problem, ansonsten funktioniert es.

    [autoit]

    Func _Add($A, $B)
    Local $C = 0, $i, $bitA, $bitB, $result, $carry = 0
    For $i = 0 To 30
    ; Bit an Position $i
    $bitA = Int(BitAND($A, 2^$i) <> 0)
    $bitB = Int(BitAND($B, 2^$i) <> 0)
    ; Berechnung
    $result = BitXOR($bitA, $bitB, $carry)
    $carry = BitOR(BitAND($bitA, $bitB), BitAND($bitA, $carry), BitAND($bitB, $carry))
    ; Ergebnis speichern
    $C = BitOR($C, $result * 2^$i)
    Next
    Return $C
    EndFunc

    [/autoit]

    MfG James

    AutoIt Version (Prod): 3.3.14.2

    AutoIt Version (Beta): 3.3.9.5

    ausgewählte Skripte: Chatbot, komplexe Zahlen (UDF)

    Einmal editiert, zuletzt von James (28. August 2013 um 15:38)