Andmestruktuurid – BitArray

.NET BCL viimati ei omanud normaalset bitarrayt, seega tegin mingisuguse kasutatavama variandi. Seda on vaja, sest muidu muutud bittwiddleriks igasugu bitstreamidega töötades ja see ei ole ilus, võin öelda omastkäest. Muidugi vahest ei saa sellist ilusat klassi kasutada, aga parem on.


public class BitArray
{
public BitArray(int sizeInBits)
{
int d = sizeInBits / 32;
array = new uint[d + 1];
count = sizeInBits;
}
public uint[] array;
public int count;
public int output_count;
public int bits_set = 0;
public void SetBit(int i, bool one)
{
if (one)
{
uint idx = (uint)i / 32;
int idx2 = (int)i % 32;
array[idx] |= (uint)(1 << idx2);
}
bits_set++;
}
public void UnsetBit(int i)
{
int idx = i / 32;
int idx2 = i % 32;
array[idx] &=(uint) ~(1 << idx2);
}
public bool IsSet(int i)
{
int idx = i / 32;
int idx2 = i % 32;
uint a = (uint)array[idx];
int mask = (1 << idx2);
return (a & mask) == 0 ? false : true;
}

}

Koodil puuduvad aksessor/mutaatorid ja võibolla veel midagi, aga pmst. töötab. bits_set on ka ainult inkrementeeriv siin variandis.

Advertisements