从2个布尔变量中获取4个整数值

时间:2018-11-10 09:18:27

标签: c#

我有一个带有两个布尔参数的函数,我想根据两个布尔输入参数优雅地构建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个整数

4 个答案:

答案 0 :(得分:5)

bool变量转换为int并执行一个移位和一个OR操作:

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

答案 1 :(得分:2)

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

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;
}

答案 2 :(得分: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;
}

并以模式方式使用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),
          }
         );
}

答案 3 :(得分:1)

您可以创建一个诸如此类的函数,以将布尔值转换为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;
}

示例代码:

void Main()
{
    Console.WriteLine(ConvertFlagsToInt(false, false));
    Console.WriteLine(ConvertFlagsToInt(false, true));
    Console.WriteLine(ConvertFlagsToInt(true, false));
    Console.WriteLine(ConvertFlagsToInt(true, true));
    Console.WriteLine(ConvertFlagsToInt(true, true, true));
}

输出

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;
    }
}

或者,如果您只想为仅两个布尔值提供快速解决方案:

static readonly int[][] map = new []{ new []{0,1}, new []{2,3}};
int ConvertFlagsToInt (bool a, bool b) => map[a?1:0][b?1:0];