Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hi!
Ich kann leider nichts dazu finden, wie sich eine Binärzahl direkt als Literal schreiben läßt.
Das geht doch ??
Immerhin geht ja auch Hexadezimal ( z.B. 0xFFFF) und Oktal (z.B. 0717).
Gibts da sowas wie %10110110 (PB) oder §$%&/§$(???)11000101110 ?
Iiih! :shock:
Dann müßte ich also eigentlich folgendes verwenden ??
Code:
int x = Integer.parseInt("11001100", 2);
Aber das ist doch bestimmt wesentlich langsamer (Funktionsaufruf mit String !!), als wenn man einfach ein Konstante an diese Stelle schreiben könnte - es sei denn, Java rechnet diesen Wert während der Kompilierung aus, dann ist es nur noch unnötiger Schreibkram.
Hmmmm.
Gibt es für Java irgendwo eine Wishlist ?? Da würde ich diesen Wunsch gerne hinschreiben.
Da ich öfter mal mit Bitketten rumspiele ist das eine recht heftige Einschränkung, und dabei auch so unsinnig, da es ja wohl gar kein Problem ist, beim Kompilieren ein Binärzahlliteral zu parsen.
Als einzige (doofe) Alternative bliebe, die Werte immer in Hex umzurechnen, aber sobald man mit Bitmustern arbeitet, wird das super unübersichtlich. (z.B. einfach 110 110 110 wird zu 0x1B6, das dient nicht gerade der Lesbarkeit, und man muss jedesmal umrechnen.)
Menno. :?
[edit]
Der Wert von parseInt wird tatsächlich jedesmal neu berechnet (was ja auch logisch ist, schließlich ist ja nicht gesagt, dass die Integer-Klasse immer unverändert bleibt...): folgendes Programm liefert bei mir, dass es für 2000000 Durchläufe schon 664ms anstelle von 10ms benötigt.
Code:
public class MyTest {
public static void main(String[] args) {
long time1, time2;
int x, max;
max = 2000000;
// Test 1
time1 = System.currentTimeMillis();
for (int i = 0; i <= max; i++)
{
x = Integer.parseInt("11001100", 2);
}
time1 = System.currentTimeMillis() - time1;
// Test2
time2 = System.currentTimeMillis();
for (int i = 0; i <= max; i++)
{
x = 0x1B6;
}
time2 = System.currentTimeMillis() - time2;
//Ausgabe
System.out.println(time1);
System.out.println(time2);
}
}
Du könntest Dir höchstens eine Art Precompiler schreiben, der Binärzahlen in einer von Dir gewünschten Notion in Hex umrechnet. Diesen läßt Du vor dem Compilieren über Deinen Quelltext laufen.
...hmmm. Dann läuft mein Source aber nur noch bei mir, bzw. dort, wo mein PreCompiler läuft...
Schöner wäre sicherlich, wenn das z.B. in 1.6.0 von Haus aus drin wäre, ansonsten muss ich erstmal mit der Integer* - Lösung leben, ist immernoch besser, als ständig zwischen Hex und Bin hin- und herzurechnen.
Ich habe das auch gerade im Developer Forum bei Sun gepostet (die Suchfunktion lieferte keine Treffer nach dieser Frage, ist das denn ein so seltener Wunsch ??).
Mal schaun.
Vielleicht hält ja auch irgendwer ein Patent auf eine "optische Darstellung zur Eingabehilfe von technischen, zweiwertigen, mehrstelligen Zustandsfolgen." oder so. Wenn nicht - vielleicht sollte ich das mal anmelden ? Das Wort 'technisch' ist immerhin enthalten. ???:L
Hex ist doch einfacher zu lesen als eine Bitfolge.
Die Umrechnung geht auch ganz simpel.
z.B. Teile Dir die Bitfolge immer in 4er Blöcke und schreibe die dazugehörige Zahl von 0-F bzw. 0 bis 15 dazu.
Klar ist Hex für viele Dinge einfacher, aber eben nicht generell.
Mir begegnen durchaus recht häufig Situationen, wo ich lieber das Bitmuster als solches direkt vor Augen haben möchte - und dann auch noch 'in place', ohne dass es zuvor möglichst außerhalb von Schleifen verschwenderisch per Integer.parseInt definiert werden muss.
z.B. siehe oben, oder zum 'mal eben' manuellen eingeben eines Flagfields oder einer Mengenbeschreibung von z.B. 16 Elementen, wo man einzelne Einträge ändern möchte. Mir fällts leichter, und teilweise passt es einfach auch besser zum Modell, wenn man z.B. bei 0101 0110 0011 0111 ohne groß
nachzudenken bei allen Vierergruppen 'mal eben' das linkeste Bit auf 1 setzen kann, als aus = 0x5637 ein 0xDEBF zu machen.
Ist auch kein weltbewegendes Problem, aber ich hielt das eigentlich für eine relativ selbstverständliche Funktion.
...dann muss man diese Konstanten aber immer erst extra definieren, und kann sie nicht einfach 'in place' verwenden, was wiederum Unübersichtlichkeit unterstützt, z.B. wenn man eine case-Abfrage mit einigen mehreren Ausgängen bastelt.
Z.B. wäre doch folgendes Stück Code schön, handlich, und leicht zu erstellen/nachzuvollziehen/ändern/warten:
Code:
...
case (i & :100100100 == 0)
case (i & :110110110 == 0)
case (i & :111111111 == 0)
case (i & :011011011 == 0)
case (i & :001001001 == 0)
...
Holla, two in one: Ich meinte die Ausdrücke eigentlich geklammert, so wie (i & :100100100) == 0, aber selbst dann gäbs Fehler, da case ja einen konstanten Ausdruck erwartet, also meine ich z.B. sowas, wie:
Jedenfalls nutze ich binäre Muster sehr häufig, da sie mir im Rahmen meiner Entdeckungstouren quer durch die Mathematik+Informatik einfach ständig über den Weg laufen, z.B. bei den Ulam-Folgen, bei Turingmaschinen, bei eigenen Codierungen, oder einfach nur für Flagfields.
Dabei finde ich es ungemein praktisch, wenn man sie direkt verwenden kann.