Ich möchte ein großes Bitfeld in JavaScript erstellen, das effektiv ein mehrdimensionales Array von Markern darstellt (verwendet Indexierung, um zu verschiedenen Dimensionen in der physischen "1D" -Struktur zu springen).
Statt einer Menge von Zahlen überlege ich, wie ich eine Zeichenfolge als Bits verwenden könnte, damit ich zuerst eine Zeichenfolge mit der entsprechenden Länge zuweisen kann. Überlegungen wie Datentypen, Unicode und Konvertierungen kommen hinzu (auch keine Unicode-Unterstützung vor JavaScript 1.3).
Ich bin jedoch offen für andere Vorschläge, wie man mit JavaScript ein großes Bitfeld erreichen kann.
Aktualisierung:
Nur zu Informationszwecken: Im Durchschnitt verwende ich vielleicht 2187 Bits / Markierungen (274 Bytes), aber ich würde gerne eine generische Antwort haben, die viel mehr Bits aufnehmen kann.
Ein Problem mit Zeichenfolgen ist, dass sie unveränderbar sind. Wenn Sie also etwas ändern möchten, müssen Sie die Zeichenfolge neu erstellen.
Ich würde nur bei der Verwendung von Zahlen bleiben. Mit den bitweisen Operatoren können Sie 32 Bits in jede Zahl einfügen.
Sie können bis zu 53 Bits einbauen, da JavaScript-Zahlen Fließkommazahlen mit doppelter Genauigkeit sind, aber die bitweisen Operatoren ihre Operanden in 32-Bit-Ganzzahlen umwandeln, so dass Sie sie nicht verwenden könnten, um die einzelnen Bits zu erhalten (Wenn du willst, könntest du dasselbe mit Divisions-Kombinationen erreichen, Math.pow
, etc., aber es wäre komplizierter).
Hier ist eine grundlegende Implementierung, mit der Sie einzelne Bits erhalten, setzen und zurücksetzen können:
%Vor% In neueren Browsern sind effiziente numerische Array-Typen verfügbar. Es gibt kein Bit-Array, aber Sie können Uint8Array
oder Uint32Array
und pack die Bits selbst (ähnlich wie Matthew Crumleys Antwort; benutze einfach einen numerisches Array anstelle von []
).
Obselete aber äquivalente Antwort ( CanvasPixelArray
wurde durch Uint8ClampedArray
ersetzt):
Wenn der von Ihnen ausgewählte Browser <canvas>
unterstützt, dann können Sie ein CanvasPixelArray
-Objekt ( canvas.getContext("2d").createImageData(...).data
; beachten Sie, dass es nicht die gleiche Größe wie die Zeichenfläche sein muss) ausleihen, um (hoffentlich) speicher effizient zu speichern die Daten (jedes Element ist ein Oktett). Und wenn Ihre Daten 2D sind, können Sie eine Visualisierung kostenlos erhalten!
Dies ist eine Erweiterung von Matthew Crumleys Beitrag von 2010:
Ich habe den Code von Matthew genommen, die Vorbelegung hinzugefügt und ihn mit typisierten Array-Implementierungen verglichen.
Dieser JSperf zeigt, dass Chrome am schnellsten und seriös ist (ich würde erwarten, dass Uint32Array
am schnellsten funktioniert) und IE nur definiert die Schnittstellen aber nicht interessiert, typisierte Arrays zu optimieren. Die Firefox-Ergebnisse sind verdunkelt, weil die Konsole mit Warnungen darüber überschwemmt wird, wie JSPerf den Testcode kompiliert.
("Andere" ist (meine anscheinend sehr private) IE 11.)
Uint8Array
Implementierung
Uint32Array
Implementierung
Tags und Links javascript