C# 从2个布尔变量中获取4个int值

C# 从2个布尔变量中获取4个int值,c#,C#,我有一个带有两个bool参数的函数,我想基于两个bool输入参数优雅地构建4个选项。例如: object GetSomeValue(bool a, bool b) { var intValue = //do something with a and b to get int value switch(intValue){ case 3 return ... case 2 return ...

我有一个带有两个bool参数的函数,我想基于两个bool输入参数优雅地构建4个选项。例如:

object GetSomeValue(bool a, bool b)
{   
    var intValue = //do something with a and b to get int value
    switch(intValue){
        case 3
           return ...
        case 2 
           return ...
        case 1
           return ...
        case 0
           return ...
    }   
}

正如你们所理解的,我指的是来自2个布尔变量的4位组合:00,01,10,11。我正在寻找如何从2个布尔变量中获得4 int的正确方法

您可以使用按位
|
运算符:

int GetSomeValue(bool a, bool b)
{   
    var intValue = 0;
    intValue = a ? intValue | 2;
    intValue = b ? intValue | 1;
    return intValue;
}
基本上,如果您有一个布尔数组:

int GetSomeValue(bool[] a)
{   
    var intValue = 0;
    for(int i=0; i< a.Length; i++)
        if(a[i]) intValue |= 1 << i;
    return intValue;
}
intgetsomevalue(bool[]a)
{   
var intValue=0;
for(int i=0;i如果(a[i])intValue |=1将
bool
变量转换为
int
,并执行一次移位和一次OR操作:

var intValue = (Convert.ToInt32(a) << 1) | Convert.ToInt32(b);

var intValue=(Convert.ToInt32(a)您可以创建这样一个函数来将布尔值转换为int。这将接受任意数量的布尔标志:

public int ConvertFlagsToInt(params bool[] flags)
{
    int result=0;
    for(var i=0; i<flags.Length; i++)
    {
        result = result * 2 + (flags[i] ? 1 : 0);
    }
    return result;
}
输出

0
1
2
3
7
如果你也想要这个函数的倒数

public IEnumerable<bool> ConvertIntToFlags(int input, int numberOfFlags = 0)
{
    var exponent = Math.Max(numberOfFlags, Math.Floor(Math.Log(input, 2)));
    var remainder = input;
    for (var i=exponent; i>=0; i--)
    {
        int bin = (int)(Math.Pow(2, i));
        var result = remainder >= bin;
        if (result) remainder -= bin;
        yield return result;
    }
}
再演几场戏

bool a=true; bool b=true;
var intValue1 = Convert.ToInt32(a) *2 + Convert.ToInt32(b);
var intValue2 = (a?2:0) + Convert.ToInt32(b);
var intValue3 = (a?2:0) + (b?1:0);

//
int bools2int(params bool[] bb)
{
    var i = new int[1];
    BitArray bitArray = new BitArray(bb);
    bitArray.CopyTo(i,0);
    var intValue4 = i[0];
    return intValue4;
}
并以模式方式使用bools2int:

void bools2actions(bool[] bb, Action[] actions)
{
    var i = bools2int(bb);
    actions[i]();
}

void demo()
{
    bools2actions(new bool[]{true, true},
          new Action[]
          {
              ()=>Console.WriteLine(0),
              ()=>Console.WriteLine(1),
              ()=>Console.WriteLine(2),
              ()=>Console.WriteLine(3),
          }
         );
}

也许a比两个
bool
参数更好。^是的。否则,如果a应该是位1,b应该是位0,那么结果=(如果(a)?2:0)+(如果(b)?1:0;@ryanpierce-williams应该编辑错误的地方。对吗?但我是个坏忍者;)谢谢,我想添加另一个解决方案:
转换为32($){Convert.ToInt32(true)}{Convert.ToInt32(true)}”,2)
bool a=true; bool b=true;
var intValue1 = Convert.ToInt32(a) *2 + Convert.ToInt32(b);
var intValue2 = (a?2:0) + Convert.ToInt32(b);
var intValue3 = (a?2:0) + (b?1:0);

//
int bools2int(params bool[] bb)
{
    var i = new int[1];
    BitArray bitArray = new BitArray(bb);
    bitArray.CopyTo(i,0);
    var intValue4 = i[0];
    return intValue4;
}
void bools2actions(bool[] bb, Action[] actions)
{
    var i = bools2int(bb);
    actions[i]();
}

void demo()
{
    bools2actions(new bool[]{true, true},
          new Action[]
          {
              ()=>Console.WriteLine(0),
              ()=>Console.WriteLine(1),
              ()=>Console.WriteLine(2),
              ()=>Console.WriteLine(3),
          }
         );
}