在bitarray中获取1的索引?

时间:2017-11-24 07:28:22

标签: c# algorithm bitarray

朋友,谁知道如何在Bitarray中获得1的索引并将其推送到数组。一些功能或其他东西

我有一个Uint16,在这里我想从这个变量读取位并获得索引1并将其放入数组或列表

3 个答案:

答案 0 :(得分:0)

您查询位阵列的每个位置并报告索引。您可以使用简单的for循环并在List中累积您的真实索引 - 我选择linq,看起来很简单:

using System.Linq;
using System.Collections;

public static IEnumerable<int> GetTrueIndexes(BitArray arr)
{
    if (arr != null)        
        return Enumerable.Range(0,arr.Count).Where( idx => arr.Get(idx));

    return new int[0];
}


public static void Main()
{
    BitArray b = new BitArray(
        "100101010000101"
        .Select(c => c == '0' ? false : true )
        .ToArray());

    var trueIndexes =  GetTrueIndexes(b);       

    System.Console.WriteLine(string.Join(", ",trueIndexes)); 
}

输出:

0,3,5,7,12,14

答案 1 :(得分:0)

第1步,准备你的BitArray:

 var bits = new BitArray (new[] { false, true, false, false, true, false, false });

步骤2,将其更改为可理解的形式(List,1 = true,0 = false)

 var list = bits.Cast<bool> ().Select (x => x ? 1 : 0).ToList ();

第3步,现在您可以使用您已经知道的IndexOf

 int index = list.IndexOf (1); // index=1, it looks from left ot right

如果您想从右向左搜索表单,请在列表中使用Reverse()方法。

这不是最佳解决方案,但我认为最容易理解。

修改

var bits = new BitArray (new[] { false, true, false, false, true, false, false });

var bitsWithIndex = bits.Cast<bool> () // we need to use Cast because BitArray does not provide generic IEnumerable
                        .Select ((bit, index) => new { Bit = bit, Index = index}); // projection, we will save bit indices

// now we will get indices of all true(1) bits [from left to right]
var indices = bitsWithIndex.Where (x => x.Bit == true).Select (x => x.Index).ToArray ();

答案 2 :(得分:0)

你有一个UInt16,你需要读取位1的索引:

List<int> GetIndexes(int number) 
{
     var result = new List<int>();
     var index = 0;
     while (number > 0) 
     {
         if (number & 1) 
         {
              result.Add(index);
         } 
         index ++;
         number >= 1;
     }

     return result;
}