JavaScript'te bir bit dizisinin uygulanmasının en iyi yolu nedir?Javascript'te nasıl bit dizisi oluşturabilirim?
cevap
yapın kişinin pozisyonda biraz almak için:
GÜNCELLEME - Bu sınıfın hakkında bir şey beni bütün gün rahatsız olmuştu - bu esaslı boyut değildi - yaratma N yuvaları/bitleri olan bir BitArray iki adımlı bir işlemdi - örnekleme, yeniden boyutlandırma. Boyut temelli örneği, dizi değerleri veya bir taban 10 sayısal değeriyle doldurmak için isteğe bağlı bir ikinci parametreyle boyutlandırılacak şekilde sınıfı güncelleştirildi. Hızlı ve kirli tabanlı prototip için Refactor soran için @Daniel Baulig İÇİN
/* 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;
};
KREDİ (bununla here ile keman)
. Stanford Javascript Crypto Library (SJCL)+1. Ama, lütfen, yöntemlerini yorumlayabilir misin? ve .ctor nedir? – DrStrangeLove
"Bu" yerine, yöntemleri "BitArray.prototype" öğesine kesinlikle eklemelisiniz. –
ve yapıcı işlevinin her çağrılmasında tüm bunları yeniden atamamalısınız. Gönderdiğim düzenlemeye bakın. –
Ben biraz diziler bilmem ama yeni özellikler ile kolay bayt dizileri yapabilirsiniz.
typed arrays arayın. Bunları hem Chrome hem de Firefox’ta kullandım. Önemli olan Uint8Array. , Node.js için
var byte = arr[5];
Buffer (sunucu tarafı) kullanın:
var arr = new UintArray(512);
ve erişen (Altıncı bayt):
512 başlatılmamış bayt dizisi sağlamak.DÜZENLEME:
bireysel bitleri, kullanım bit maskeleri erişmek için.
Ben çırpılmış bir İştenum & 0x1
IE veya Firefox 3.6 gibi yaygın tarayıcılarda nasıl kullanırsınız? – Jiri
Firefox 3.6 düzgün çalışmalı. IE için düzenli bir dizi kullanın ve yalnızca tam sayıların girdiğinden emin olun. Bit maskeleme hala işe yarayacaktır. – tjameson
Eski tarayıcıları tamamen yok sayıyorum. Eski bir tarayıcı kullanıyorlarsa, kullanıcılara "Üzgünüz, lütfen gerçek bir tarayıcı indirin. İşte bir çift link ..." deyin. Bu tüm dünyayı iyi yapardı = D – tjameson
Bit Diziler (Hex Strings, Byte Diziler vs.) Bit Dizisi uygulamasını sağlar ve farklı girişler dönüştürebilirsiniz.
Onların kod GitHub'dan üzerinde geneldir: bitwiseshiftleft/sjcl. Yani, eğer bitArray.js'u ararsanız, bit dizisi uygulamalarını bulabilirsiniz.
bit bayt bir dönüşüm
here bulunabilir.- 1. Bir bit dizesinin sonuna bit bir bit nasıl birleştirilir?
- 2. Nesnede var mı yoksa javascriptte mi var
- 3. 2 boyutlu bir dinamik uzunluk dizisi nasıl oluşturabilirim?
- 4. R Kullanımı: Tarihleri içeren bir zaman dizisi nesnesini nasıl oluşturabilirim?
- 5. Bit Dizeleri: bir bit dizgisinin başka bir
- 6. Varsayılan kurucu ile sınıfımın dizisini nasıl oluşturabilirim?
- 7. Bit Bit çevirme
- 8. Fibonacci dizisinin arrayını nasıl tekrar oluşturabilirim?
- 9. Nasıl BigQuery Görünümü oluşturabilirim
- 10. Uygulamamdaki bölümleri nasıl oluşturabilirim?
- 11. Saplama işlevlerini nasıl oluşturabilirim?
- 12. MongoDB'de nasıl belge oluşturabilirim?
- 13. NSMutableArray yapılarını nasıl oluşturabilirim?
- 14. İkili yamalar nasıl oluşturabilirim?
- 15. Kart görünümünü nasıl oluşturabilirim?
- 16. Rayları nasıl oluşturabilirim mysql
- 17. İkili dizeden bir bitset nasıl oluşturabilirim?
- 18. nasıl ben bit maskesi
- 19. İşlev dizisi olarak dizge dizisi nasıl iletilir?
- 20. Rasgele matrislerin Numpy dizisi
- 21. Javascript - farklı pozitif tamsayılar dizisi için ikili bir temsili hızlı bir şekilde nasıl oluşturabilirim
- 22. İmzasız 32 bit int imzasız 32 bit int nasıl dönüştürülür?
- 23. Bluetooth 16 bit hizmet UUID'sini 128 bit UUID'ye nasıl dönüştürebilirim?
- 24. Nasıl 32 bit C# uygulaması bir 64 bit DLL kullanabiliyor
- 25. C - 8 bit 32 bit olup olmadığını nasıl kontrol edelim?
- 26. Her zaman 32 bit ve 64 bit makinede 64 bit
- 27. Kayan nokta sayı dizisi (bulanıklaştırma) nasıl yapılır
- 28. Sanal CPU ile Vagrant'ta VM'leri iki CPU'yla nasıl oluşturabilirim?
- 29. Bir ObjectSet örneğini nasıl oluşturabilirim?
- 30. Java sanal alanını nasıl oluşturabilirim?
size dönük konum sorunu tarif eder misiniz? –
hiçbir sorun yok. sadece öğrenme amaçlıdır. – DrStrangeLove
Bir bit dizisini taklit edebilirsiniz, ancak her dizi öğesinin hala bayt olarak saklandığına inanıyorum, böylece bellek avantajını elde edemezsiniz. – vol7ron