größere hexwerte addieren, aber wie ?

  • hallo, ich habe in einem array zwei hexwerte die mal so groß sein können:
    wert1: "dddddddd"
    wert2: "11111111"
    ^^ das geht schon nicht ... zumindest weiss ich nicht wie...
    leider könnte es sogar auch vorkommen, dass mal größere werte (bis 64bit)
    addiert werden müssen .... hier dran darf ich gar nicht denken...
    leider hab ich keine lösung (nicht mal für das beispiel mit den relativ kleinen werten) gefunden...

    LG

    Einmal editiert, zuletzt von WhiteLion (26. Juli 2011 um 00:05)

  • Spoiler anzeigen

    ???? ich verstehe deine frage nicht ganz, du kannst alle hexwerte mit einander muliplizieren addieren auch hoch nehmen die wurzel (das wird teilweise sehr schwer bis unmöglich und teilweise auch sehr leicht, kommt auf den wert an) ziehen oder was weiss ich....
    das hexadezimal ist halt nur ein anderes "zählsystem" als das dezimalsystem

    Einmal editiert, zuletzt von PuhDerBär (26. Juli 2011 um 01:04)

  • wie denn ?

    das geht z.B. nicht:

    [autoit]


    $x = "DDDDDDDD"
    $y = "11111111"
    MsgBox(0,"$result",hex("x0"&$x+"x0"&$y))

    [/autoit]

    das schon:

    [autoit]


    $x = 0xDDDDDDDD
    $y = 0x11111111
    MsgBox(0,"$result",hex("x0"&$x+"x0"&$y))

    [/autoit]


    ... bringt mir aber nix, da die werte im array ohne "0x" vorliegen und dar pure "davorhängen" wie im beispiel drüber geht ja nicht. :( zumal es vorkommen kann, das der hexwert größer als 32 bit ist und dann gibts nen bösen crash.

    wenn ich es vorher per "dec" aus dem array in dezimal wandel, dann es es noch stärker begrenzt, weil man mit dezimalzahlen leider auch nicht unbegrenzt rechnen kann :(

    Einmal editiert, zuletzt von WhiteLion (26. Juli 2011 um 00:39)

  • Ich habe mal schnell was zusammengebastelt. Die Geschwindigkeit wird wohl nicht die beste sein.

    [autoit]

    Func _HexAdd($a, $b)
    ; ProgAndy
    Local $c, $overflow = 0, $x, $y, $z
    While $a Or $b
    $x = Dec(StringRight($a, 6)) + $overflow
    $a = StringTrimRight($a, 6)
    $y = Dec(StringRight($b, 6))
    $b = StringTrimRight($b, 6)
    $z = $x + $y
    $overflow = 0
    If $z > 0xFFFFFF Then $overflow = 1
    $c = Hex($z, 6) & $c
    WEnd
    While StringLeft($c, 2) = "00"
    $c = StringTrimLeft($c, 2)
    WEnd
    Return $c
    EndFunc

    [/autoit]
  • Spoiler anzeigen

    hi, das blose davorhängen geht schon, wenn du wissen möchtest wie müsste ich nochmal nachsehen.

    für den rest bin ich grad zu müde^^

    allerdings addiert das script von progandy große zahlen nicht richtig, da es die hexzahlen auf 6 stellen kürzt...
    Wenn ich ehrlich bin habe ich mich bei autoit biser mit hexzahlen nur beschäftigt wenn es um farben ging... allerdings wäre es wahnsinnig blöde wenn das ganze nicht gehen würde, da es sich schlicht und ergreifend nur um ein anderes zahlenformat handelt wie beim dezimalsystem.
    in der theorie kann man mit beiden systemen (ebenso mit dualsystem und anderen) bis ins unendliche rechenen...

    edit: wahnsinn.... habe es gerade getestet... da könnt ich mich ja schon wieder tierisch drüber aufregen.... beim hexsystem ist ja wirklich schnell schluss.... genauer gesagt bei FFFFFFFF (8xF)
    bei allen kleineren werten die in der summe nicht mehr als FFFFFFFF ergeben wird korrekt ein ergebnis bei:

    [autoit]

    $x = 0x00000001
    $y = 0x0000000F
    MsgBox(0,"result",hex($x+$y))

    [/autoit]


    ausgegeben

    2 Mal editiert, zuletzt von PuhDerBär (26. Juli 2011 um 01:03)

  • Spoiler anzeigen
    [autoit]

    $x = "DDDDDDDD"
    $y = "11111111"
    Func HexToInt($hex)
    Return Int(Binary("0x"&$hex))
    EndFunc
    Func IntToHex($int)
    Return StringTrimLeft(Binary($int), 2)
    EndFunc

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

    Func HexAdd($a, $b)
    Return IntToHex(HexToInt($a) + HexToInt($b))
    EndFunc
    Func HexSub($a, $b)
    Return IntToHex(HexToInt($a) - HexToInt($b))
    EndFunc
    Func HexMul($a, $b)
    Return IntToHex(HexToInt($a) * HexToInt($b))
    EndFunc
    ; etc

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

    MsgBox(0,"$result", HexAdd($x, $y))

    [/autoit]

    Geht mit den Funktionen einfach und Fehler lassen sich schnell beheben.
    Generell würde ich aber vorschlagen, intern immer mit integern zu rechnen und nur bei Ausgabe (Datei, MessageBox) in Hex umzuwandeln.

  • danke für die antworten und das script :D

    also auf die geschwindigkeit kommts leider schon etwas an. ich habe aber schon die bignum.udf gefunden welche das verrechnen von großen dezimalzahlen ermöglicht. leider keine hex .... im grunde wäre mir wohl geholfen, wenn ich große hexzahlen in dezimal und wieder zurück wandeln könnte.... (zumindest meine ich das, ohne alle funktionen durchdacht zu haben die ich ändern müsste....)

    edit:
    oh super danke... mit dem beispiel wäre es dann mit 32bit/int gelöst....
    .... aber was ist mit 64bit ?

    Einmal editiert, zuletzt von WhiteLion (26. Juli 2011 um 00:58)

  • Wow, ich nehme alles zurück... Ich verstehe meine Welt nicht mehr....
    Ich mach mal ein neues Thema auf, weil mich das jetzt echt interessiert^^

  • @progandy 
    das problem ist nur:
    ich brauche noch subtrahieren... und evtl noch weitere ;(
    und das array was abgearbeitet wird ist unterschiedlich groß, so dass zwischen
    30 und 120 solcher rechnungen pro sekunde durchgeführt werden sollten.... :(

    Marthog
    ich probier das mal aus mit größeren werten ... war gestern zu spät.
    EDIT: geht nicht ... alles über 4 byte hängt nullen an und addiert nicht.

    danke aber schonmal jungens :)

    2 Mal editiert, zuletzt von WhiteLion (26. Juli 2011 um 08:54)