Comment puis-je créer un tableau de bits en version javascript?

Quelle est la meilleure façon de mettre en œuvre un tableau de bits en JavaScript?

Voici ce que j'ai fait:

MISE À JOUR – quelque chose au sujet de cette classe m'avait dérangé toute la journée – ce n'était pas basé sur la taille – créer un BitArray avec N machines à sous / bits était une opération en deux étapes – instancier, redimensionner. Mise à jour de la classe pour être basée sur la taille avec un second paramètre optionnel pour remplir l'instance basée sur la taille avec des valeurs de tableau ou une valeur numérique de base 10.

(Fiddle avec lui ici )

/* BitArray DataType */ // Constructor function BitArray(size, bits) { // Private field - array for our bits this.m_bits = new Array(); //.ctor - initialize as a copy of an array of true/false or from a numeric value if (bits && bits.length) { for (var i = 0; i < bits.length; i++) this.m_bits.push(bits[i] ? BitArray._ON : BitArray._OFF); } else if (!isNaN(bits)) { this.m_bits = BitArray.shred(bits).m_bits; } if (size && this.m_bits.length != size) { if (this.m_bits.length < size) { for (var i = this.m_bits.length; i < size; i++) { this.m_bits.push(BitArray._OFF); } } else { for(var i = size; i > this.m_bits.length; i--){ this.m_bits.pop(); } } } } /* BitArray PUBLIC INSTANCE METHODS */ // read-only property - number of bits BitArray.prototype.getLength = function () { return this.m_bits.length; }; // accessor - get bit at index BitArray.prototype.getAt = function (index) { if (index < this.m_bits.length) { return this.m_bits[index]; } return null; }; // accessor - set bit at index BitArray.prototype.setAt = function (index, value) { if (index < this.m_bits.length) { this.m_bits[index] = value ? BitArray._ON : BitArray._OFF; } }; // resize the bit array (append new false/0 indexes) BitArray.prototype.resize = function (newSize) { var tmp = new Array(); for (var i = 0; i < newSize; i++) { if (i < this.m_bits.length) { tmp.push(this.m_bits[i]); } else { tmp.push(BitArray._OFF); } } this.m_bits = tmp; }; // Get the complimentary bit array (ie, 01 compliments 10) BitArray.prototype.getCompliment = function () { var result = new BitArray(this.m_bits.length); for (var i = 0; i < this.m_bits.length; i++) { result.setAt(i, this.m_bits[i] ? BitArray._OFF : BitArray._ON); } return result; }; // Get the string representation ("101010") BitArray.prototype.toString = function () { var s = new String(); for (var i = 0; i < this.m_bits.length; i++) { s = s.concat(this.m_bits[i] === BitArray._ON ? "1" : "0"); } return s; }; // Get the numeric value BitArray.prototype.toNumber = function () { var pow = 0; var n = 0; for (var i = this.m_bits.length - 1; i >= 0; i--) { if (this.m_bits[i] === BitArray._ON) { n += Math.pow(2, pow); } pow++; } return n; }; /* STATIC METHODS */ // Get the union of two bit arrays BitArray.getUnion = function (bitArray1, bitArray2) { var len = BitArray._getLen(bitArray1, bitArray2, true); var result = new BitArray(len); for (var i = 0; i < len; i++) { result.setAt(i, BitArray._union(bitArray1.getAt(i), bitArray2.getAt(i))); } return result; }; // Get the intersection of two bit arrays BitArray.getIntersection = function (bitArray1, bitArray2) { var len = BitArray._getLen(bitArray1, bitArray2, true); var result = new BitArray(len); for (var i = 0; i < len; i++) { result.setAt(i, BitArray._intersect(bitArray1.getAt(i), bitArray2.getAt(i))); } return result; }; // Get the difference between to bit arrays BitArray.getDifference = function (bitArray1, bitArray2) { var len = BitArray._getLen(bitArray1, bitArray2, true); var result = new BitArray(len); for (var i = 0; i < len; i++) { result.setAt(i, BitArray._difference(bitArray1.getAt(i), bitArray2.getAt(i))); } return result; }; // Convert a number into a bit array BitArray.shred = function (number) { var bits = new Array(); var q = number; do { bits.push(q % 2); q = Math.floor(q / 2); } while (q > 0); return new BitArray(bits.length, bits.reverse()); }; /* BitArray PRIVATE STATIC CONSTANTS */ BitArray._ON = 1; BitArray._OFF = 0; /* BitArray PRIVATE STATIC METHODS */ // Calculate the intersection of two bits BitArray._intersect = function (bit1, bit2) { return bit1 === BitArray._ON && bit2 === BitArray._ON ? BitArray._ON : BitArray._OFF; }; // Calculate the union of two bits BitArray._union = function (bit1, bit2) { return bit1 === BitArray._ON || bit2 === BitArray._ON ? BitArray._ON : BitArray._OFF; }; // Calculate the difference of two bits BitArray._difference = function (bit1, bit2) { return bit1 === BitArray._ON && bit2 !== BitArray._ON ? BitArray._ON : BitArray._OFF; }; // Get the longest or shortest (smallest) length of the two bit arrays BitArray._getLen = function (bitArray1, bitArray2, smallest) { var l1 = bitArray1.getLength(); var l2 = bitArray2.getLength(); return l1 > l2 ? smallest ? l2 : l1 : smallest ? l2 : l1; }; 

CRÉDIT À @Daniel Baulig pour demander que le réfactor soit rapide et sale à prototype basé.

Je ne connais pas les tableaux de bits, mais vous pouvez rendre les tableaux d'octets faciles avec de nouvelles fonctionnalités.

Recherchez les tableaux dactylographiés . Je l'ai utilisé dans Chrome et Firefox. L'important est Uint8Array.

Pour créer un ensemble de 512 octets non initialisés:

 var arr = new UintArray(512); 

Et l'accéder (le sixième octet):

 var byte = arr[5]; 

Pour node.js, utilisez Buffer (côté serveur).

MODIFIER:

Pour accéder à des bits individuels, utilisez des masques bit.

Pour obtenir le bit dans sa position, ne num & 0x1

La Bibliothèque Crypto Javascript de Stanford (SJCL) fournit une implémentation Bit Array et peut convertir différentes entrées (Hex Strings, Byte Arrays, etc.) en Bit Arrays.

Leur code est public sur GitHub: bitwiseshiftleft / sjcl . Donc, si vous recherchez bitArray.js , vous pouvez trouver leur mise en réseau bit array.

Une conversion d'octets en bits peut être trouvée ici .