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}`
答案 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));
}