在JavaScript中實現位數組的最佳方式是什麼?如何在Javascript中創建位數組?
回答
這裏有一個我掀起了:
更新 - 一些關於這個課堂上一直困擾着我整天 - 它不是基於大小 - 創建具有N個插槽/位的BitArray是兩步操作 - 實例化,調整大小。使用可選的第二個參數更新該類的大小,以便使用數組值或基數爲10的數值填充基於大小的實例。
(撥弄它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;
};
信貸@Daniel Baulig詢問從快速和骯髒的基於原型的重構。
+1。但是,請問您可以評論您的方法嗎?什麼是.ctor? – DrStrangeLove
你應該絕對將方法添加到''BitArray.prototype''而不是''this''。 –
,每次調用構造函數時都不應該重新分配所有這些。請參閱我提交的修改。 –
我不知道位數組,但是可以使用新功能輕鬆地創建字節數組。
查找typed arrays。我在Chrome和Firefox中都使用過這些。重要的是Uint8Array。
爲了使512個未初始化字節的數組:
var arr = new UintArray(512);
和訪問它(第六個字節):
var byte = arr[5];
對於node.js的,使用Buffer(服務器端)。
編輯:
訪問各個位,利用位掩碼。
若要獲取一個人的位置的位,做num & 0x1
Stanford Javascript Crypto Library (SJCL)提供了位陣列實現,並可以將不同的輸入(十六進制字符串,字節數組等)轉換爲位數組。
他們的代碼在GitHub上公開:bitwiseshiftleft/sjcl。所以如果你查找bitArray.js,你可以找到他們的位陣列實現。
從字節到位的轉換可以找到here。
- 1. 如何在javascript中創建位置數組?
- 2. 在Javascript中創建數組
- 3. 如何創建和組織JavaScript數組?
- 4. 如何在Javascript中創建一個數組數組?
- 5. 如何在javascript中創建html組件
- 6. 如何在JavaScript中創建128位大小的無符號整數數組?
- 7. 如何僅在特定位置使用元素在javascript中創建數組?
- 8. 如何創建位數組目標C
- 9. 在javascript中爲數組創建函數。
- 10. 創建Javascript數組
- 11. Javascript,如何創建日期數組?
- 12. 如何創建javascript multidimentional數組?
- 13. Jinja2:如何創建多維javascript數組?
- 14. javascript如何創建對象數組
- 15. 如何創建JavaScript多維數組?
- 16. 如何用Javascript動態創建數組?
- 17. 如何在JavaScript中使用.push和.unshift創建函數數組
- 18. 如何從JavaScript數組中創建一個簡單的數組?
- 19. 如何在JavaScript中創建18位數的時間戳?
- 20. 如何在JavaScript中創建8位數字?
- 21. 如何使用Three.js在JavaScript中爲數組創建幾何?
- 22. 在javascript中創建2d數組
- 23. 在javascript中創建對象數組
- 24. 在javascript中創建數組的問題
- 25. 在javascript中創建對象的數組
- 26. 在Javascript中創建數組的結構
- 27. 在javascript中創建嵌套數組
- 28. 在javascript中創建多維數組
- 29. 在javascript中創建關聯數組
- 30. 在JavaScript中創建數組與Html.action
您能否描述您面臨的問題? –
沒有問題。這只是爲了學習的目的。 – DrStrangeLove
您可能會模仿一個位數組,但我相信每個數組元素仍然以字節存儲,因此您不會獲得內存優勢。 – vol7ron