在C#中实现类似位域的操作
时间:2011-01-23 来源:天方
/// <summary>
///这个类主要用于那种将一个字节分成若干部分,每个部分表示一个数的类型
/// </summary>
class BitHelper
{
public static byte GetByte(byte data, byte index, byte count)
{
Contract.Requires(index + count <= 8);
return (byte)((data >> (8 - index - count)) % (1 << count));
}
public static byte SetByte(int value, byte data, byte index, byte count)
{
Contract.Requires(index + count <= 8);
Contract.Requires(value < (1 << count));
var tail = data % (1 << (8 - index - count));
return (byte)((((data >> (8 - index) << count) + value) << index) + tail);
}
//测试某一位是否为1
public static bool TestBit(byte data, byte index)
{
return GetByte(data, index, 1) == 1;
}
public static byte SetBit(bool value, byte data, byte index)
{
return SetByte(value ? 1 : 0, data, index, 1);
}
}
这个类并不能直接用,也是辅助实现的操作,一般用于在属性中封装某个字段。
private byte flags = 5;
public byte Flags
{
get { return flags; }
set { flags = value; }
}
public bool TypeFlagsAudio
{
get { return BitHelper.TestBit(flags, 5); }
set { flags = BitHelper.SetBit(value, flags, 5); }
}
public bool TypeFlagsVideo
{
get { return BitHelper.TestBit(flags, 7); }
set { flags = BitHelper.SetBit(value, flags, 7); }
}