node data charset array javascript bitarray

data - ¿Cómo creo un array de bits en Javascript?



json to csv javascript (4)

Algo como esto es lo más cercano que puedo pensar. Guarda matrices de bits como números de 32 bits y tiene una matriz estándar que lo respalda para manejar conjuntos más grandes.

class bitArray { constructor(length) { this.backingArray = Array.from({length: Math.ceil(length/32)}, ()=>0) this.length = length } get(n) { return (this.backingArray[n/32|0] & 1 << n % 32) > 0 } on(n) { this.backingArray[n/32|0] |= 1 << n % 32 } off(n) { this.backingArray[n/32|0] &= ~(1 << n % 32) } toggle(n) { this.backingArray[n/32|0] ^= 1 << n % 32 } forEach(callback) { this.backingArray.forEach((number, container)=>{ const max = container == this.backingArray.length-1 ? this.length%32 : 32 for(let x=0; x<max; x++) { callback((number & 1<<x)>0, 32*container+x) } }) } } let bits = new bitArray(10) bits.get(2) //false bits.on(2) bits.get(2) //true bits.forEach(console.log) /* outputs: false false true false false false false false false false */ bits.toggle(2) bits.forEach(console.log) /* outputs: false false false false false false false false false false */ bits.toggle(0) bits.toggle(1) bits.toggle(2) bits.off(2) bits.off(3) bits.forEach(console.log) /* outputs: true true false false false false false false false false */

¿Cuál es la mejor manera de implementar una matriz de bits en JavaScript?


Aquí hay uno que saqué:

ACTUALIZACIÓN: algo sobre esta clase me había estado molestando todo el día, no se basaba en el tamaño, crear un BitArray con N slots / bits era una operación de dos pasos: crear una instancia, cambiar el tamaño Se actualizó la clase para que esté basada en el tamaño con un segundo parámetro opcional para rellenar la instancia basada en el tamaño con valores de matriz o un valor numérico de base 10.

(Jugar con esto here )

/* 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 (i.e., 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ÉDITO A @Daniel Baulig por solicitar el refactor de rápido y sucio a prototipo.



No sé sobre matrices de bits, pero puede hacer que las matrices de bytes sean fáciles con las nuevas características.

Busque matrices mecanografiadas . Los he usado tanto en Chrome como en Firefox. El importante es Uint8Array.

Para hacer una matriz de 512 bytes sin inicializar:

var arr = new UintArray(512);

Y accediendo a él (el sexto byte):

var byte = arr[5];

Para node.js, use Buffer (lado del servidor).

EDITAR:

Para acceder a bits individuales, utilice máscaras de bits.

Para obtener el bit en la posición de uno, haga num & 0x1