DecToBin (Adaptive)

  • Moin,

    bevor ich meine eigenen Skripte wieder verlege und nie wieder finde, lade ich sie lieber mal hoch, dann findet man sie im Notfall in der Suche ;)

    Anbei ist eine DecToBin UDF. Sie kann... Dezimalzahlen in Binärzahlen umwandeln und umgekehrt (vermutlich geistern davon 10 Versionen durchs Forum). Neulich habe ich die Adaptive Version davon gesucht und nicht mehr gefunden, der Aufbau ist trivial, also war es einfach dasselbe nochmal zu schreiben.

    Die UDF ist von 2014 (im Prinzip sogar noch älter, aber ich habe irgendwann mal aufgeräumt, die UDF wurde eigentlich hier geboren: Link, da ist sogar schon die vielsagende Variablenbenennung ($a_, $c_, etc) vorhanden), steinigt mich nicht für den unleserlichen nicht wartbaren erroranfälligen Code. Den schreibe ich auch heute noch :D

    Edit 10.05.23: Vollständig adaptive Version hinzugefügt die bis uint31-1 funktioniert (und nicht wie vorher bis uint28-1)

    Funktionsweise: Eine Integerzahl wird als "Prefix" + "Bitrepräsentation" abgebildet.

    Beispiel:

    Zahl = 244368

    Theoretisch benötigte Bits = 18 (da 2^18-1 = 262143 >= Zahl), normalerweise speichert man aber 32 Bit. Und das wollen wir optimieren.

    Binärdarstellung: 1 & 11011101010010000 Erstes Bit kann entfernt werden, denn es ist immer eine Eins, außer bei den Zahlen 0 und 1, wo dieses Bit tatsächlich gebraucht wird.

    Prefix: 00111 (Beispielhaft, ergibt sich aus HuffmanTree)

    Resultat: 00111 & 11011101010010000 -> 22 Bits um eine 18 Bit Zahl zu kodieren.

    - Außerdem kann man eine eigene Wahrscheinlichkeitstabelle angeben in der man festlegen kann wie wahrscheinlich Zahlen in gewissen Bereichen sind um noch ein Paar Bits einzusparen. Diese Tabelle muss man allerdings beim Dekodieren ebenfalls mitliefern. Ansonsten benutzt man einfach die "default" Tabelle (die ich von Hand gebastelt habe, die ist ganz okay für die Meisten Fälle).

    - Der Prefix wird nicht mehr (wie vorher) von Hand eingetackert, sondern vollautomatisch (Huffman) generiert.

    - Beim Dekodieren wird die Bitlänge mit ausgegeben (siehe @extended), es sind also keine Trennzeichen zwischen aufeinanderfolgenden Zahlen nötig, man kann die Bits einfach hintereinanderschreiben.

    Hinweis: Die Adaptive Version bringt natürlich nur etwas, wenn die Zahlen die man kodieren will nicht gleichverteilt sind. Egal wie cool die Funktion ist, die Entropie kann sie nicht überlisten.


    Anwendungsfall: (hypothetisch) Ich möchte ganz viele Zahlen die maximal uint31 groß sind möglichst gut verpackt speichern. Die Zahlen sind nicht gleichverteilt (sie haben irgendein Muster, z.B. kleine Zahlen sind sehr häufig, Zahlen im bereich 2000 sind auch sehr häufig (z.B. für Jahreszahlen), große Zahlen wie 25095382 sind relativ selten), aber es sind so viele verschiedene, dass eine Entropiekodierung nicht funktioniert (da werden ja "zahlen" als einzelne Symbole interpretiert, und wenn alle Zahlen unterschiedlich sind wird die Tabelle die man speichern muss größer als wenn man die Zahlen direkt mit 31Bit/Zahl speichert). Die hier gezeigte Methode verwendet eine Entropiekodierung auf "Bereiche" anstatt auf einzelne Zahlen. Deshalb ist das ganze quasi ein "Pseudo Huffman für Zahlen die nicht mehrfach auftauchen aber in einer ähnlichen Größenordnung liegen".

    Edit 12.05.23: Paar kleine Änderungen in der UDF für mehr Benutzerfreundlichkeit.

    Falls Fehler auftauchen: Meldet euch, ich habe das nur kurz getestet.

    lg

    M

  • Hi,

    bevor ich meine eigenen Skripte wieder verlege und nie wieder finde, lade ich sie lieber mal hoch, dann findet man sie im Notfall in der Suche ;)

    so sie denn nicht wie schon viiiile andere Beiträge auch, für immer im Forennirvana verschwinden ;(

    Du hängst doch mit dem "neuen" Dec2Bin nicht etwa an dem alten Thread von 2011?! :rofl:

  • Du hängst doch mit dem "neuen" Dec2Bin nicht etwa an dem alten Thread von 2011?! :rofl:

    Ooooooh, ja... So findet man seinen alten Code wieder und wieder und wieder (in 10 verschiedenen threads) ^^
    Da ging es aber eher um "wie kann ich einen riesigen String aus Dezimalzahlen ins Hexadezimalsystem bringen".

  • Moin Mars

    Moin,

    bevor ich meine eigenen Skripte wieder verlege und nie wieder finde, ...

    Das Problem kenne ich doch. Ich habe mich aber irgendwann (letztes Jahr) entschieden, alle Include-Dateien in einen Ordner zu sammeln.

    Die Dec2Bin kommt gleich dazu. ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Ich hab ja auf meinem PC schon einen AutoIt-Ordner mit unmengen Skripten die ich üblicherweise auch korrekt benenne. Aber das klappt auch nur, wenn man alles was man mit AutoIt macht grundsätzlich in diesen Ordner verschiebt und benennt/taggt. Der "adaptive" Teil ist in irgendeinem Skript wo ich das ausprobiert hatte, habe es aber nicht in die Dec2Bin UDF eingebaut, obwohl es da eigentlich hingehört.

    Ich glaube ich bastel noch eine "optimale" Version davon (der prefix wird via HuffmanTree ermittelt anstatt dass man ihn "pi mal Daumen" von Hand schätzt). Das wäre dann so:
    - Input: Wahrscheinlichkeit für 1, 2, ..., n Bit Zahlen (dann kann man den Huffman mit den Symbolen 1, 2, ..., n und den Wahrscheinlichkeiten p(1), p(2), ... p(n) laufen lassen)

    - Output: Prefixset das die benötigten Bits zur Darstellung dieser Zahlen minimiert.
    (wir sind hier aber immernoch mit "ganzen Bits ohne Übertrag" unterwegs, also wird der Prefix auf maximal 0.5 Bit optimal, außerdem werden Sonderstellungen (z.B. die Zahl 0 taucht echt oft auf, und sollte daher nicht als "prefix + bits", sondern direkt kodiert werden) nicht berücksichtigt, was im schlimmsten fall nochmal ein Bit pro Zahl schluckt... ). Immernoch weit vom Entropielimit entfernt, aber ein erster Ansatz.

    Edit: Ich bin ziemlich blöd... Habe irgendwann mal eine Base.au3 gebastelt (zur Umrechnung zwischen z.B. Base10 und Base2, vielleicht kennt man sie aus meiner Abgabe zum Kompressionswettbewerb, Februar 22 von Oscar). Dort war auch die Adaptive version... Warum hat mir die Windows Suche (die ja angeblich auch Dateiinhalte durchsucht) das nicht angezeigt? Muss ich den Ordner wirklich mit VS Code öffnen und dann suchen? Oh man...

    Edit2: Adaptive Version (Huff) ist im Startpost. Die wollte ich schon seit Ewigkeiten bauen und hab es immer nicht gemacht^^

    M

  • Mars 9. Mai 2023 um 22:54

    Hat den Titel des Themas von „DecToBin“ zu „DecToBin (Adaptive)“ geändert.