Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#是否有将二进制数转换为位幂数组的内置方法(例如0b1101->;{0,2,3})?_C#_Binary_Set - Fatal编程技术网

C#是否有将二进制数转换为位幂数组的内置方法(例如0b1101->;{0,2,3})?

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

(编辑-前言:我正在通过给定大小的所有子集实现一个iterable。 为了获得下一个组合,我使用Gosper的hack快速获得下一个组合的0/1向量。现在我需要快速将组合向量映射到集合中的元素数组。幸运的是,元素与单个位的幂非常相同,我想知道C#是否没有快速的快捷方式帽子。)

如果我得到数字0-(N-1)的第K个子集(按字典顺序),则K的二进制表示中的位告诉我应该选择哪些元素。检查设置了哪些位并基于这些位生成子集(数组)的最优雅的方法是什么

比如:

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);