Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于位值启用行为_C#_Algorithm - Fatal编程技术网

C# 基于位值启用行为

C# 基于位值启用行为,c#,algorithm,C#,Algorithm,我有一系列基于位值启用/禁用的行为。例如,行为“A”的状态为0或1,行为“B”为0或2,行为“C”为0或4,等等。如果包含状态的变量的值为“5”,我知道行为“A”和“C”已启用。“B”不是。然后,我的程序应切换到A&C 我不知道这叫什么,所以希望这里有人能给我一个名字,把我推向正确的方向。如何基于状态变量以编程方式创建已启用函数的列表?我想用这种方式控制20-30种行为。太多,无法手动管理。您可以使用或。他们从你身上抽走了一点点操纵 如果要直接操作int变量中的单个位,可以使用逐位运算符: 检查

我有一系列基于位值启用/禁用的行为。例如,行为“A”的状态为0或1,行为“B”为0或2,行为“C”为0或4,等等。如果包含状态的变量的值为“5”,我知道行为“A”和“C”已启用。“B”不是。然后,我的程序应切换到A&C

我不知道这叫什么,所以希望这里有人能给我一个名字,把我推向正确的方向。如何基于状态变量以编程方式创建已启用函数的列表?我想用这种方式控制20-30种行为。太多,无法手动管理。

您可以使用或。他们从你身上抽走了一点点操纵

如果要直接操作
int
变量中的单个位,可以使用逐位运算符:

检查是否设置了第i位:
bool isSet=(变量&(1以下是一个简单的示例:

class DispatchTable
{
    readonly Action[] _actions;

    public DispatchTable(params Action[] actions)
    {
        _actions = actions;
    }

    public void Execute(ulong actionsMask)
    {
        for (int bitIx = 0; bitIx < _actions.Length && actionsMask != 0; bitIx++, actionsMask >>= 1)
        {
            if ((actionsMask & 0x01) != 0)
                _actions[bitIx]();
        }           
    }

    static void Main(string[] args)
    {
        DispatchTable t = new DispatchTable(
            delegate() { Console.WriteLine(1); },
            delegate() { Console.WriteLine(2); },
            delegate() { Console.WriteLine(3); }
        );

        t.Execute(0x04);
        t.Execute(0x02);
        t.Execute(0x01);
        t.Execute(0x0F);
    }
}
类调度表
{
只读操作[]_操作;
公共调度表(参数操作[]操作)
{
_行动=行动;
}
公共无效执行(ulong actionsMask)
{
对于(int-bitIx=0;bitIx<\u actions.Length&&actionsMask!=0;bitIx++,actionsMask>>=1)
{
如果((actionsMask&0x01)!=0)
_动作[bitIx]();
}           
}
静态void Main(字符串[]参数)
{
DispatchTable t=新的DispatchTable(
委托(){Console.WriteLine(1);},
委托(){Console.WriteLine(2);},
委托(){Console.WriteLine(3);}
);
t、 执行(0x04);
t、 执行(0x02);
t、 执行(0x01);
t、 执行(0x0F);
}
}
variable |= (1 << i);
variable &= ~(1 << i);
variable ^= (1 << i);
class DispatchTable
{
    readonly Action[] _actions;

    public DispatchTable(params Action[] actions)
    {
        _actions = actions;
    }

    public void Execute(ulong actionsMask)
    {
        for (int bitIx = 0; bitIx < _actions.Length && actionsMask != 0; bitIx++, actionsMask >>= 1)
        {
            if ((actionsMask & 0x01) != 0)
                _actions[bitIx]();
        }           
    }

    static void Main(string[] args)
    {
        DispatchTable t = new DispatchTable(
            delegate() { Console.WriteLine(1); },
            delegate() { Console.WriteLine(2); },
            delegate() { Console.WriteLine(3); }
        );

        t.Execute(0x04);
        t.Execute(0x02);
        t.Execute(0x01);
        t.Execute(0x0F);
    }
}