C# 从2个布尔变量中获取4个int值
我有一个带有两个bool参数的函数,我想基于两个bool输入参数优雅地构建4个选项。例如: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 ...
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),
}
);
}