C#是否有将二进制数转换为位幂数组的内置方法(例如0b1101->;{0,2,3})?
(编辑-前言:我正在通过给定大小的所有子集实现一个iterable。 为了获得下一个组合,我使用Gosper的hack快速获得下一个组合的0/1向量。现在我需要快速将组合向量映射到集合中的元素数组。幸运的是,元素与单个位的幂非常相同,我想知道C#是否没有快速的快捷方式帽子。) 如果我得到数字0-(N-1)的第K个子集(按字典顺序),则K的二进制表示中的位告诉我应该选择哪些元素。检查设置了哪些位并基于这些位生成子集(数组)的最优雅的方法是什么 比如:C#是否有将二进制数转换为位幂数组的内置方法(例如0b1101->;{0,2,3})?,c#,binary,set,C#,Binary,Set,(编辑-前言:我正在通过给定大小的所有子集实现一个iterable。 为了获得下一个组合,我使用Gosper的hack快速获得下一个组合的0/1向量。现在我需要快速将组合向量映射到集合中的元素数组。幸运的是,元素与单个位的幂非常相同,我想知道C#是否没有快速的快捷方式帽子。) 如果我得到数字0-(N-1)的第K个子集(按字典顺序),则K的二进制表示中的位告诉我应该选择哪些元素。检查设置了哪些位并基于这些位生成子集(数组)的最优雅的方法是什么 比如: var BitPowers = new Lis
var BitPowers = new List<int>();
for(int i = 0; i<N; ++i)
{
if((K & (1<<i)) != 0)
{
BitPowers.Add(i);
}
}
return BitPowers.ToArray();
var BitPowers=new List();
据我所知,对于(inti=0;i来说,没有.NET内置API来做这样的事情
林奇魔法
您可以在一次分配中编写此紧凑代码,但速度优化程度较低:
int value = 0b10110010;
var BitPowers = Convert.ToString(value, 2)
.Reverse()
.Select((bit, index) => new { index, bit })
.Where(v => v.bit == '1').Select(v => v.index);
foreach ( int index in BitPowers )
Console.WriteLine(index);
它将整数转换为字符串的二进制表示形式,从左到右反转为具有良好的索引,然后选择一对(位,索引),然后过滤已定义的索引,然后选择用于创建可枚举列表的索引
输出
优雅与速度的折衷
可以使用BitArray实例简化循环
也许这是你要求的最接近的“内置”方式:
var bits = new BitArray(BitConverter.GetBytes(value));
for ( int index = 0; index < bits.Length; index++ )
if ( bits[index] )
BitPowers.Add(index);
var bits=新的位数组(BitConverter.GetBytes(value));
for(int index=0;index
没有内置功能,但您可以自由编写自己的代码,并将其发布到code review,看看那里的人是否可以改进。-顺便说一句:要“优化”,您需要决定要优化的内容:速度、空间、优雅度、可维护性…?-另外:\可能的集合数量是指数级的\不确定这意味着什么?\非常酷,运行2次faster(在100万个随机数上测试,200次)
var bits = new BitArray(BitConverter.GetBytes(value));
for ( int index = 0; index < bits.Length; index++ )
if ( bits[index] )
BitPowers.Add(index);