【C#】ビット操作用クラス

2020/03/21C#, DEVELOP

BitArray で機能が物足りない時に作成したものを公開しています。

目次

ソースコード

using System;
 
namespace mira
{
    /// <summary>
    ///  ビット操作によるフラグ
    /// </summary>
    public class BitFlag<T> where T : struct
    {
        private int m_flag;
 
        /// <summary>
        /// フラグ追加
        /// </summary>
        /// <param name="_flag"></param>
        public void AddFlag(T _flag)
        {
            m_flag |= 1 << GetIntValue(_flag);
        }
 
        /// <summary>
        /// フラグ削除
        /// </summary>
        /// <param name="_flag"></param>
        public void DelFlag(T _flag)
        {
            m_flag &= ~(1 << GetIntValue(_flag));
        }
 
        /// <summary>
        /// フラグ設定
        /// </summary>
        /// <param name="_flag"></param>
        public void SetFlag(T _flag, bool _b)
        {
            if (_b)
            {
                AddFlag(_flag);
            }
            else
            {
                DelFlag(_flag);
            }
        }
 
        /// <summary>
        /// フラグ確認
        /// </summary>
        /// <param name="_flag"></param>
        public bool HasFlag(T _flag)
        {
            return (m_flag & (1 << GetIntValue(_flag))) > 0;
        }
 
        /// <summary>
        /// フラグ確認(一度だけ。確認した後は折れる)
        /// </summary>
        /// <param name="_flag"></param>
        public bool OneTimeFlag(T _flag)
        {
            var temp = HasFlag(_flag);
            DelFlag(_flag);
            return temp;
        }
 
        /// <summary>
        /// フラグのリセット
        /// </summary>
        public void ResetFlag()
        {
            m_flag = 0;
        }
 
        /// <summary>
        /// intへ変換
        /// </summary>
        private int GetIntValue(T _flag)
        {
            return (int)((object)_flag);
        }
    }
}

使い方

// 宣言周り
public enum Flag
{
    Jump,
    OnClose,
}
private BitFlag<Flag> flag = new BitFlag<Flag>();
 
// フラグ追加
flag.AddFlag(Flag.Jump);
 
// フラグ確認
if (flag.OneTimeFlag(Flag.Jump))
{
    // 処理
}

Posted by kazupon