2011-08-07 19 views
20

JavaScript'te bir bit dizisinin uygulanmasının en iyi yolu nedir?Javascript'te nasıl bit dizisi oluşturabilirim?

+6

size dönük konum sorunu tarif eder misiniz? –

+3

hiçbir sorun yok. sadece öğrenme amaçlıdır. – DrStrangeLove

+1

Bir bit dizisini taklit edebilirsiniz, ancak her dizi öğesinin hala bayt olarak saklandığına inanıyorum, böylece bellek avantajını elde edemezsiniz. – vol7ron

cevap

16

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)

+0

+1. Ama, lütfen, yöntemlerini yorumlayabilir misin? ve .ctor nedir? – DrStrangeLove

+1

"Bu" yerine, yöntemleri "BitArray.prototype" öğesine kesinlikle eklemelisiniz. –

+0

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. –

12

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 İşte num & 0x1

+1

IE veya Firefox 3.6 gibi yaygın tarayıcılarda nasıl kullanırsınız? – Jiri

+0

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

+7

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

4

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.

İlgili konular