異世界


2012年8月1日 星期三

用索引子指向bit [BitVector16]

工作中經常要取得某個數值的某個bit,以下範例改寫並簡化 .NET 原本的 BitVector32 結構

將屬性 Data 變成可以讀寫,並將CreateMaskCreateSection 等刪除。

原 BitVector32 中的 Index 指的是 BitMask,將她更改為 Bit Index。

例如:

/* BitVector32 */
BitVector32 BV32 = new BitVector32 (0);

BV32[6] = true; // 得到結果 BV32.Data 為 {0000 0000 0000 0000 0000 00000000 0110}, 十進制為 6

MessageBos.Show(BV32.ToString() );

/* BitVector16 */
BitVector16 BV16 = new BitVector16 (0);

BV16[6] = true; // 得到結果 BV16.Data 為 {0000 0000 0100 0000}, 十進制為 64

MessageBos.Show(BV16.ToString() );


BitVector16 可以定義成 Class 也各以定義成 struct。

完整列表如下:
public class BitVector16
{
/* 欄位 */
private uint data;

/* 建構式 */
public BitVector16(uint data)
{
this.data = (uint)data;
}
public BitVector16(BitVector16 value)
{
this.data = value.data;
}

/* 屬性 */
public bool this[int index]
{
get
{
if ((index > 15) || (index < 0)) { throw new Exception("BitVector16: Index out of range."); }
uint mask = (uint)(0x01) << index;
return (data & index) == (uint)mask;
}
set
{
if ((index > 15) || (index < 0)) { throw new Exception("BitVector16: Index out of range."); }
uint mask = (uint)(0x01) << index;
if (value)
{
data |= mask;
}
else
{
data &= ~mask;
}
}
}
public int Data
{
get
{
return (int)data;
}
set
{
data = (uint)value; //.. Jeremy 2012/08/01
}
}

/* 方法 */
public override bool Equals(object o)
{
if (!(o is BitVector16))
{
return false;
}

return data == ((BitVector16)o).data;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public override string ToString()
{
return BitVector16.ToString(this);
}
public static string ToString(BitVector16 value)
{
StringBuilder sb = new StringBuilder(/*"BitVector16{".Length*/12 + /*16 bits*/16 + /*"}".Length"*/1);
sb.Append("BitVector16{");
int locdata = (int)value.data;
for (int i = 0; i < 16; i++)
{
if ((locdata & 0x8000) != 0)
{
sb.Append("1");
}
else
{
sb.Append("0");
}
locdata <<= 1;
}
sb.Append("}");
return sb.ToString();
}
}

沒有留言:

張貼留言