.NET Framework にはビット集合ってないんだっけ?
お遊びにこしらえました。メソッド少な杉...あとは任したぜ > とりこびっち
namespace SilverBouquet {
public class BitSet {
private sbyte[] bits_;
private int size_;
/// <summary>
/// 長さnbitsビットのビット集合を作る
/// </summary>
/// <param name="nbits">ビット数</param>
public BitSet(int nbits) {
size_ = nbits;
int nbytes = (nbits+7)/8;
bits_ = new sbyte[nbytes];
}
/// <summary>
/// 第nビットの参照と設定
/// </summary>
/// <param name="n">ビット番号</param>
/// <returns>第nビットの値</returns>
public bool this[int n] {
get { return (bits_[n/8] & (1 << n%8)) != 0; }
set { if ( value ) { bits_[n/8] |= (sbyte)(1 << n%8); }
else { bits_[n/8] &= (sbyte)~(1u << n%8); } }
}
/// <summary>
/// 第nビットを反転する
/// </summary>
/// <param name="n">ビット番号</param>
public void Flip(int n) { this[n] = !this[n]; }
/// <summary>
/// ビット数
/// </summary>
public int Size { get { return size_; } }
/// <summary>
/// 二進数による表現
/// </summary>
/// <returns>'0'と'1'で表したビット集合</returns>
public override string ToString() {
System.Text.StringBuilder sb = new System.Text.StringBuilder();
for ( int i = size_-1; i >= 0; --i ) sb.Append(this[i] ? '1' : '0');
return sb.ToString();
}
}
}