Zahlensysteme ausrechnen

  • Hallo,

    hat jemand eine Idee, wie man eine Funktion schreiben könnte, mit der man alle Zahlensysteme von 2 - 16 ausrechnen kann?

    Falls das jemand nicht kennt. Das funktioniert immer so:

    Umrechnung der Zahl 53 (2er Basis)

    -------53 : 2 = 26 Rest 1
    -------26 : 2 = 13 Rest 0
    -------13 : 2 = 6 Rest 1
    --------6 : 2 = 3 Rest 0
    --------3 : 2 = 1 Rest 1
    --------1 : 2 = 0 Rest 1

    Resultat : 110101

    Weiß jemand wie man das umsetzen könnte. Also ungefähr so wie hier:

    http://www.arndt-bruenner.de/mathe/scripts/Zahlensysteme.htm

  • Hab dir mal ein Skript gemacht (kann bestimmt gekürzt werden^^):

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    MsgBox(0, "", _Umrechnen(53, 2))

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

    Func _Umrechnen($zZahl, $bBasis)
    Local $aArray[1][2]=[["Zahl", "Rest"]], $oK, $res
    If Not IsNumber($zZahl) Or Not IsNumber($bBasis) Then
    SetError(1, 0, 0)
    Else
    $rech = Execute($zZahl/$bBasis)
    $split = StringSplit($rech, ".")
    If @error Then
    $oK = $zZahl
    Else
    $oK = $split[1]
    EndIf
    $ret = Mod($zZahl, $bBasis)
    _Add($aArray, $oK,$ret)
    Do
    $rech = Execute($aArray[UBound($aArray,1) -1][0]/$bBasis)
    $split = StringSplit($rech, ".")
    If @error Then
    $oK = $rech
    Else
    $oK = $split[1]
    EndIf
    $ret = Mod($aArray[UBound($aArray,1) -1][0], $bBasis)
    _Add($aArray, $oK, $ret)
    Until $oK = 0
    For $i = UBound($aArray,1)-1 To 1 Step -1
    $res &= $aArray[$i][1]
    Next
    Return $res
    EndIf
    EndFunc

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

    Func _Add(ByRef $Array, $1, $2)
    Local $daten[2]
    $daten[0] = $1
    $daten[1] = $2
    ReDim $Array[UBound($Array,1) +1][UBound($Array,2)]
    For $i = 0 To UBound($Array,2) -1
    $Array[UBound($Array, 1) -1][$i] = $daten[$i]
    Next
    EndFunc

    [/autoit]

    /edit: Ok hab grad den edit von Greenhorn gesehen geht viel kürzer!
    Hab nur den Code von Bugfix bisschen angepasst:

    Spoiler anzeigen
    [autoit]

    MsgBox(0, "", _IntToBin(53, 2))

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

    Func _IntToBin($zZahl, $bBasis)
    $ret = ''
    Do
    $ret = Mod($zZahl, $bBasis) & $ret
    $zZahl = Floor($zZahl/$bBasis)
    Until $zZahl = 0
    Return $ret
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von xXTobi93Xx (28. Oktober 2009 um 19:44)

  • Hat Prog@ndy auch mal was geschrieben:

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ;
    ; Function Name: _TranslateSystem
    ; Description:: Wandelt eine Zahl zwischen verschiedenen Zahlensystemen um.
    ; Parameter(s): $zahl - Die Zahl zum Umwandeln
    ; $OldSystem - [Optional] Das alte System (Default: 10)
    ; $NewSystem - [Optional] Das neue System (Default: 2)
    ; Requirement(s):
    ; Return Value(s): Success: Number in new format and @extended set to SystemBase
    ; Error: -1.#NAN or -1.#IND
    ; @error set to:
    ; 1 - Zahl nicht richtig formatiert
    ; 2 - neues System nicht im darstellbaren Bereich
    ; 3 - altes System nicht im darstellbaren Bereich
    ; 4 - Zahl enthält Zeichen, die nicht im System vorkommen
    ; Author(s): Prog@ndy; sd (VB-Code)
    ; VB source used from http://www.vbarchiv.net/tipps/details.php?id=1590
    ;
    ;===============================================================================
    ;
    Func _TranslateSystem($zahl, $OldSystem=10, $NewSystem = 2)
    Local $out ;' Ausgabevariable
    Local $temp ;' Temporäre Variable
    $OldSystem = Int($OldSystem)
    $NewSystem = Int($NewSystem)
    Select
    Case Not StringRegExp($zahl,"\A[0-9a-zA-Z]+\Z")
    Return SetError(2,0,"-1.#NAN")
    Case $NewSystem < 2 Or $NewSystem > 62
    Return SetError(2,0,"-1.#IND")
    Case $OldSystem < 2 Or $OldSystem > 62
    Return SetError(3,0,"-1.#IND")
    EndSelect
    ;' Zeichen der Zahlensysteme ( bis Hexadezimalsystem )
    Local $chrsys = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

    If $OldSystem <> 10 Then
    Local $CaseSense = ($OldSystem > 36)
    Local $ziffern = StringSplit($zahl,""), $nummer
    $zahl = 0
    For $i = 1 To $ziffern[0]
    $nummer = StringInStr($chrsys,$ziffern[$i],$CaseSense,1)
    If $nummer > 0 Then $zahl += ($nummer-1)*($OldSystem^($ziffern[0]-$i))
    If $nummer > $OldSystem Then Return SetError(4,0,"1.#NAN")
    Next
    EndIf

    ;' Solange bis Zahl = 0
    While $zahl <> 0
    ;' Stelle der Zahl ermitteln
    $temp = Mod($zahl, $NewSystem )
    ;' Zahl anhängen
    $out = StringMid($chrsys, $temp + 1, 1) & $out
    ;' Integerdivision
    $zahl = Int($zahl / $NewSystem)
    Wend
    SetExtended($NewSystem)
    Return $out
    EndFunc

    [/autoit]