Stiefel: Hex/Dezimal konvertieren mal ganz easy!

Hallo!

In der Forumsauslese findet sich schon ein Beispiel wie man aus Hex-Werten int-Werte macht.
Und andersrum? Dummerweise gibt es ja nur nur einen Variablentyp. Sonst wärs einfach.
Alle Scripte die ich bis jetzt mit dieser Möglichkeit gesehen habe, sind min. 100 Zeilen lang. (z.B. der Rechner in SelfHTML)

Es gibt aber trotzdem eine einfache Lösung: Bitoperatoren. (Allerdings nur einfach, wenn man weiß wie die funken. SelfHTML verwehrt ja leider einen tieferen Einblick... ;-)
Den folgenden Code hab ich auf einer Seite im Web gefunden.

var HexChars="0123456789ABCDEF";
function Hex(dec)
{
return HexChars.charAt((dec>>4)&0xf)+HexChars.charAt(dec&0xf)
}

function Dec(hex)
{
return parseInt(hex.toUpperCase(),16)
}

Kleine Erklärung:
Beide Funktionen erwarten einen Übergabewert der umgewandelt werden soll
Die Funktion Hex, die Hexwerte zurückgibt, benötigt noch die Variable die darübersteht.

Das ganze läßt sich (wenn man von Bitoperatoren etwas mehr Ahnung hat als ich ;-)
sicher auch auf Andere Zahlensysteme übertragen.

Spätestens dann, finde ich, sollte das in die Auslese aufgenmmen werden.
Stefan? Was meinst du dazu?
Vielleicht kann das ja jemand noch auf Binär und Oktal-Werte übertragen und sich dann bei dir melden?

Viel Spaß beim basteln, konvertieren und Code abspecken... ;-)

Stiefel

  1. auch hi

    var HexChars="0123456789ABCDEF";
    function Hex(dec)
    {
    return HexChars.charAt((dec>>4)&0xf)+HexChars.charAt(dec&0xf)

    4 == /16 :-) (4 bits nach rechts schieben = /2 hoch 4)

    Diese Funktion funktioniert nur fuer hex-zahlen <=255 (=0xFF)

    cua

    n.d.p.

    1. nochmal hi

      4 == /16 :-) (4 bits nach rechts schieben = /2 hoch 4)
      Diese Funktion funktioniert nur fuer hex-zahlen <=255 (=0xFF)

      Na und? Wann braucht man denn schon größere? Ich hab Hexzahlen auf Webseiten bis jetzt nur im Zusammenhang mit Farben gesehen.
      Und sicher kann man doch mit einem kleinen Zusatz das ganze bis FFF erweitern, oder? (Wie gesagt: Bitoperatoren keine Ahnung)

      Stiefel

      1. Hallo,

        4 == /16 :-) (4 bits nach rechts schieben = /2 hoch 4)
        Diese Funktion funktioniert nur fuer hex-zahlen <=255 (=0xFF)

        Na und?
        Und sicher kann man doch mit einem kleinen Zusatz das ganze bis FFF erweitern, oder?

        Na klar:

        var HexChars="0123456789ABCDEF";
        function Hex(dec)
        { var a = 0;
        var HexZahl = "";
        while (dec>>a != 0)
        { HexZahl = HexChars.charAt((dec>>a)&0xf) + HexZahl;
          a+=4;
        }
        return HexZahl
        }

        Mit leichten Änderungen kannst du das auch für Oktalzahlen und Binärzahlen verwenden.
        oktal: die Und-Bedingung in der Bitmaske auf 7 setzen und a jeweils um 3 erhöhen
        binär: die Und-Bedingung in der Bitmaske auf 1 setzen und a jeweils um 1 erhöhen

        (Wie gesagt: Bitoperatoren keine Ahnung)

        Kurzer Versuch einer Erklärung:
        Die Zahl ist in Binärform gespeichert (in Bits => 0 oder 1)
        Beispiel: Die Dezimalzahl 26 ist im Binärsystem 11010.
        1 * 2^4 + 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0 = 26
        (16 + 8 + 0 + 2 + 0 = 26)

        Nun zur Umwandlung:
        4 Bits entsprechen einer Hexadezimalstelle.
        11010 wird beim ersten Durchlauf mit 0xf (1111 in Bit-Form) verknüpft.
        Es wird bitweise eine UND-Bedingung abgefragt (0 bleibt 0, 1 bleibt 1).
        Dadurch maskiert man die letzten 4 Bitstellen, die in dem Beispiel 1010 sind.
        (bzw F hexadezimal, 15 dezimal)
        Also: 1010 => A.

        Beim zweiten Durchlauf werden die Bits 4 Stellen nach rechts geschoben:
        Aus 11010 verschwinden die letzten 4 Stellen; übrig bleibt 1.
        Zusammengesetzt ergibt sich die Hexadezimalzahl 1A.

        Für Oktalzahlen gilt im Prinzip das gleiche, nur das 3 Bit eine Oktalstelle bilden.

        Johannes

        1. Moin,

          weil wir gerade so schön dabei sind .... noch eine kleine Verallgemeinerung weiter:

          ==8><==========================================================

          var digits = "0123456789ABCDEF";

          function convert(src, base_from, base_to) {
            var tmp = 0, factor=1, result = "";
            for(i=src.length-1; i>=0; --i) {
              tmp += digits.indexOf(src.substring(i, i+1))*factor;
              factor *= base_from;
            }
            
            while(tmp>0) {
              result = digits.charAt(tmp % base_to) + result;
              tmp = Math.floor(tmp/base_to);
            }

          return result;  
          }

          window.alert("255 Decimal sieht in Hex so aus: "+convert("255", 10, 16));
          window.alert("Die Zahl '442520' ist in echt 'ne Schnapszahl:"+convert("442520", 7, 10));

          ==8><==========================================================

          Damit kann man nun von einem fast beliebigen Zahlensystem ins andere Konvertieren.
          Wenn man ein Zahlensystem mit Basis > 16 benötigt, müssen an den String 'digit'
          entsprechend viele Zeichen angefügt werden. Mit dem Alphabet kommt man immerhin
          erstmal bis zum 36'er System. Das ganze funktioniert aufgrund der internen
          Umrechnung natürlich nur mit Zahlwerten, die in eine JavaScript-Integervariable passen,
          also typischerweise 32-bit Zahlen. Wär doch mal'n schöner Feierabendspaß (*ggg*), das
          ganze für beliebig lange Zeichenketten in Javascript zu programmieren, aber ich vermute,
          das gibt's schon längst irgendwo...

          Bis dannundwann

          Andreas