提取设置为HashSet <uint>的位?

时间:2016-02-01 20:02:25

标签: c# linq

c#中是否有一种方便的方法(使用linq或类似方法)将uint的真实位提取到HashSet<uint>

示例:

  private HashSet<uint> ExtractTrueBitsFromSum(uint sum)
  {

  } 

calling it with 15 returns the set `{1,2,4,8}`
calling it with 23 returns the set `{1,2,4,16}`
calling it with 31 returns the set `{1,2,4,8,16}`

5 个答案:

答案 0 :(得分:2)

q

答案 1 :(得分:0)

这似乎适用于int s:

int n = 23;
string str = Convert.ToString(n, 2);


HashSet<int> result = new HashSet<int>(str.Select((c, index) => 
                             int.Parse(c.ToString()) > 0 ? (int)Math.Pow(2, index) : 0));
result.Remove(0);

编辑 - 考虑相反的位顺序:

HashSet<int> result = new HashSet<int>(str.Reverse().Select((c, index) => 
                             int.Parse(c.ToString()) > 0 ? (int)Math.Pow(2, index) : 0));
result.Remove(0);

编辑2:

HashSet<uint> result = new HashSet<uint>(str.Reverse().Select((c, index) => 
                              int.Parse(c.ToString()) > 0 ? (uint)Math.Pow(2, index) : 0));
result.Remove(0);

答案 2 :(得分:0)

我只是使用明显的循环而不打扰Linq:

private HashSet<uint> ExtractTrueBitsFromSum(uint sum)
{
    var set = new HashSet<uint>();

    for (uint j = 1; j != 0; j <<= 1)
        if ((sum & j) != 0)
            set.Add(j);

    return set;
}

答案 3 :(得分:0)

我认为没有任何理由使用LINQ。

<script>
  console.log(std.setUrl());
</script>

答案 4 :(得分:0)

如果您更喜欢LINQ:

private HashSet<uint> ExtractTrueBitsFromSum(uint sum)
{
    var bits = Convert.ToString(sum, toBase: 2);
    return new HashSet<uint>(
                bits.Select((bit, index) => (uint)(bit - '0') << (bits.Length - index - 1))
                    .Where(pow => pow > 0));
}