1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
using System;
namespace System.Runtime.Serialization
{
class BitFlagsGenerator
{
int bitCount;
byte [] locals;
public BitFlagsGenerator (int bitCount)
{
this.bitCount = bitCount;
int localCount = (bitCount+7)/8;
locals = new byte [localCount];
}
public void Store (int bitIndex, bool value)
{
if (value)
locals [GetByteIndex (bitIndex)] |= GetBitValue(bitIndex);
else
locals [GetByteIndex (bitIndex)] &= (byte) ~GetBitValue(bitIndex);
}
public bool Load (int bitIndex)
{
var local = locals[GetByteIndex(bitIndex)];
byte bitValue = GetBitValue(bitIndex);
return (local & bitValue) == bitValue;
}
public byte [] LoadArray ()
{
return (byte []) locals.Clone ();
}
public int GetLocalCount ()
{
return locals.Length;
}
public int GetBitCount ()
{
return bitCount;
}
public byte GetLocal (int i)
{
return locals [i];
}
public static bool IsBitSet (byte[] bytes, int bitIndex)
{
int byteIndex = GetByteIndex (bitIndex);
byte bitValue = GetBitValue (bitIndex);
return (bytes[byteIndex] & bitValue) == bitValue;
}
public static void SetBit (byte[] bytes, int bitIndex)
{
int byteIndex = GetByteIndex (bitIndex);
byte bitValue = GetBitValue (bitIndex);
bytes[byteIndex] |= bitValue;
}
static int GetByteIndex (int bitIndex)
{
return bitIndex >> 3;
}
static byte GetBitValue (int bitIndex)
{
return (byte)(1 << (bitIndex & 7));
}
}
}
|