朋友,谁知道如何在Bitarray中获得1的索引并将其推送到数组。一些功能或其他东西
我有一个Uint16,在这里我想从这个变量读取位并获得索引1并将其放入数组或列表
答案 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;
}