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