Une implémentation vraiment naïve, j'espère que cela vous aidera à saisir l'idée. Aussi non testé, susceptible de contenir hors par une erreur etc ...
class BitArray {
// public fields for example code, in real code encapsulate
public int bits=0; // actual count of stored bits
public byte[] buf=new byte[1];
private void doubleBuf() {
byte [] tmp = new byte[buf.length * 2];
System.arraycopy(buf, 0, tmp, 0, buf.length);
buf = tmp;
}
private int arrayIndex(int bitNum) {
return bitNum/8;
}
private int bitNumInArray(int bitNum) {
return bitNum & 7; // change to change bit order in buf's bytes
}
// returns how many elements of buf are actually in use, for saving etc.
// note that last element usually contains unused bits.
public int getUsedArrayElements() {
return arrayIndex(this.bits-1) + 1;
}
// bitvalue is 0 for 0, non-0 for 1
public void setBit(byte bitValue, int bitNum) {
if (bitNum >= this.bits || bitNum < 0) throw new InvalidArgumentException();
if (bitValue == 0) this.buf[arrayIndex(bitNum)] &= ~((byte)1 << bitNumInArray(bitNum));
else this.buf[arrayIndex(bitNum)] |= (byte)1 << bitNumInArray(bitNum);
}
public void addBit(int bitValue) {
// this.bits is old bit count, which is same as index of new last bit
if (this.buf.length <= arrayIndex(this.bits)) doubleBuf();
++this.bits;
setBit(bitValue, this.bits-1);
}
int readBit(int bitNum) { // return 0 or 1
if (bitNum >= this.bits || bitNum < 0) throw new InvalidArgumentException();
byte value = buf[arrayIndex(bitNum)] & ((byte)1 << bitNumInArray(bitNum));
return (value == 0) ? 0 : 1;
}
void addBits(int bitCount, int bitValues) {
for (int num = bitCount - 1 ; num >= 0 ; --num) {
// change loop iteration order to change bit order of bitValues
addBit(bitValues & (1 << num));
}
}
Pour une solution efficace, il devrait utiliser int ou long tableau au lieu de tableau d'octets, et inclure la méthode plus efficace pour addition multiple bits (ajouter parties de bitValues
un élément entier de tableau buf
à la fois, pas bit par bit comme ci-dessus).
Pour sauvegarder ceci, vous devez sauvegarder le bon nombre d'octets de buf, calculé par getUsedArrayElements()
.
Cela n'a aucun sens. 2^6 <101 <2^7 donc il devrait prendre au moins 7 bits. Si vous voulez traiter les chiffres 101 comme des caractères, utilisez un tableau char. Et préparez votre programme à se bloquer chaque fois qu'il reçoit un nombre qui n'est pas composé de 0 et 1, par ex. 2, 13, 102, etc. – djechlin
Le nombre '101' est un ensemble de bits. Je voudrais créer un fichier qui stocke la chaîne binaire et avoir moins de taille (j'utilise l'encodage Huffman), puis le fichier original avec du texte (UTF-8). – user1518451
Ce n'est pas un ensemble de bits. C'est un nombre entier. La représentation binaire de cet entier est '1100101'. Le seul bitset il serait logique de l'interpréter comme est '1100101'. Utilisez le type de données correct. – djechlin