根据list元素的值将数组/列表转换为二进制数:0或不是0

时间:2016-09-15 15:29:56

标签: c# arrays binary boolean converter

我收到一个包含4个数字的数组/列表。首先,我想将其转换为二进制数组,然后将其转换为十进制数。 (我了解到,这可以通过“聚合”功能实现。) 二进制值用于根据数组中的位置为4个变量分配true / false值。 如果列表的元素的值= 0则二进制值= 0 =假,如果值<> 0然后二进制值= 1 =真。

所有4个数字总是正数。例如。

{40 60 80 100} - > {1 1 1 1} - > 15(十进制)    - > position1 = True; position2 = True; position3 = True; position4 = True;

{20 0 40 80} - > {1 0 1 1} - > 11(十进制)    - > position1 = True; position2 = False; position3 = True; position4 = True;

{0 0 20 50} - > {0 0 1 1} - > 3(十进制)    - > position1 = False; position2 = False; position3 = True; position4 = True;

谢谢!

我使用的解决方案:

double [] source = new double[] {10,20,0,10};
int result = source.Aggregate(0, (a, x) => (a << 1) | (x == 0 ? 0 : 1));

var bools = new BitArray(new int[] { result }).Cast<bool>().ToArray();

position 1 = bools[0]; //true
position 2 = bools[1]; //true
position 3 = bools[2]; //false
position 4 = bools[3]; //true

//编辑16/09:添加到请求中并使其更具体 //第二次编辑:添加了我使用的解决方案。

3 个答案:

答案 0 :(得分:1)

只需Aggregate int[]List<int>通过 Linq

  int[] source = new int[] { 20, 0, 40, 80 };

  int result = source.Aggregate(0, (a, x) => (a << 1) | (x == 0 ? 0 : 1));

测试:

  // "1011 or 11 (decimal)"
  Console.Write(String.Format("{0} or {1} (decimal)",
    Convert.ToString(result, 2), result));

答案 1 :(得分:0)

另一种选择是首先构建实际位表示,然后将其转换为十进制:

var bitsString = string.Join(string.Empty, list.Select(x => x == 0 ? 0 : 1));
var result = Convert.ToInt32(bitsString, 2)

答案 2 :(得分:0)

这是一个非常简单易懂的方式:

var inputCollection = new List<int> { 40, 60, 80, 100 };
var binaryStringBuilder = new StringBuilder();
foreach (var input in inputCollection)
{
    binaryStringBuilder.Append(input == default(int) ? 0 : 1);
}

var binaryRepresentation = binaryStringBuilder.ToString();
var decimalRepresentation = Convert.ToInt32(binaryRepresentation, 2).ToString();
Console.WriteLine("Binary representation: {0}", binaryRepresentation);
Console.WriteLine("Decimal representation: {0}", decimalRepresentation);