Erstelle ein großes Bitfeld?

8

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.

    
John K 08.08.2010, 19:15
quelle

4 Antworten

12

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%     
Matthew Crumley 09.08.2010, 00:08
quelle
4

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!

    
Kevin Reid 10.08.2010 02:12
quelle
3

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

%Vor%

Uint32Array Implementierung

%Vor%     
Domi 12.09.2014 11:14
quelle
-1

Im Chrom bekomme ich ungefähr 10.000 Bits.

%Vor%     
Matt Williamson 08.08.2010 22:08
quelle

Tags und Links