Einfache Aufgabe: Binärzahl, aber mit Tricks

Nun, brauche (längere) Zahlen in allen möglichen Darstellungen. Methode:

        int n = (int) Math.round(Math.log10(ca.length) / Math.log10(2));
        System.out.println("n = " + n);
        StringBuilder sb = new StringBuilder(Long.SIZE);
        for (int i = Long.SIZE - n; i >= 0; i -= n) {
            sb.append(ca[(int) (nmbr << i >>> Long.SIZE - n)]);
        }
        System.out.println(sb.reverse().toString());
    }```

Test: ```        char[] ca = "0123456789abcdef".toCharArray();
        printNmbr(-2, "01".toCharArray());
        printNmbr(-2, ca);
        printNmbr((15 << 4) + 15, ca);```

Probbs: Logarithmus zur Basis 2? Abrunden und/oder floor? Nur casten? Was wäre mit "0123456789abcdefr" oder "012" oder von 0 bis 9 (dezimal)? Und ist es nun gut, mit Long.SIZE-n anzufangen? Bitmasken? static, Rückgabetyp?

Kann bei n 3,999 rauskommen, und mit (int) caste ich dann auf 3? Halloween :mad: Aufgabe.

Doch nicht ohne Fehler, sieht euch das an:

    private static final char[][] caa = {
        "01".toCharArray(),
        "0123".toCharArray(),
        "01234567".toCharArray(),
        "0123456789abcdef".toCharArray(),
        "0123456789ABCDEF".toCharArray()
    };

    public static void printAll(long l) {
        for (char[] cs : caa) {
            printL(l, cs);
        }
    }

    public static void printL(long l, char[] ca) {
        int n = (int) (Math.log10(ca.length) / Math.log10(2));
        System.out.printf("l=%020d, ca=%s, n=%d%n", l, Arrays.toString(ca), n);
        StringBuilder sb = new StringBuilder(Long.SIZE);
        for (int i = Long.SIZE - n; i >= 0; i -= n) {
            sb.append(ca[(int) (l << i >>> Long.SIZE - n)]);
        }
        System.out.println(sb.reverse().toString());
    }```

```        System.out.println(Math.log10(2048) / Math.log10(2));
        System.out.println((int) (Math.log10(2048) / Math.log10(2)));
        printAll(-l);
        printAll(Long.MAX_VALUE + 1);
        printAll(Long.MAX_VALUE / 10);```

Binär, oktal, hexadezimal usw.

1. ich muss nicht runden, aus Math.log10(x) / Math.log10(2), wenn x 2^y ist, kommt immer eine ganze/gerade Zahl,
2. Long.SIZE is 64, 64 / 3 ist aber keine ganze Zahl, deswegen fällt das erste Bit von l einfach weg...
3. enums?,
4. hättet ihr das auch so geschrieben, oder hättet ihr einfach >>/> 1 + Bitmasken, solange x != 0, geschrieben?
Thx, bis später, LLL ist einfach irgendein Wert, eventuell in das richtige "sub"forum verschieben. :)

http://docs.oracle.com/javase/8/docs/api/java/lang/Long.html#toString-long-int-

Stimmt, und ist nicht erst neu in 7 oder 8.

Allerdings brauche ich auch 32- und 64(Zeichen)-basiert. Ich setze das Thema mal auf “gelöst”.

Die gepostete Methode kann bis Radix 36 [0-9a-z] arbeiten und sollte eigentlich nur ein Hinweis sein das es sowas gibt und du dir da im Source mal abgucken kannst wie das umgesetzt wurde.
Wenn du mit Radix 64 meinst das du lowercase und Uppercase getrennt behandeln willst (also das A != a ist) dürfte es lustig werden, denn bei der Idee sind Konflikte doch schon quasi automatisch vorprogrammiert. Ansonsten wäre vielleicht Base64 (bzw eine Implementierung davon um mal zu gucken wie das so abläuft) hilfreich.

Hier hätte man auch schreiben können,

    private static final char[][] caa = {
        "01".toCharArray(),
        "0123".toCharArray(),
        "01234567".toCharArray(),
        "0123456789abcdef".toCharArray(),
        String.valueOf(caa[3]).toUpperCase().toCharArray()
    };```
wenn erlaubt wär.