Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# 将二进制数5转换为整数列表(4,1)_C#_.net - Fatal编程技术网

C# 将二进制数5转换为整数列表(4,1)

C# 将二进制数5转换为整数列表(4,1),c#,.net,C#,.net,我有一个以二进制数表示的配置值,允许在同一个值内有多个选项 例如,5的值应为101或同时为4和1 是否有人知道输入值“5”并获取返回的{1,4}列表的最佳/最快方法?如果您想获取由以下值组成的2的幂: int value = 5; var addendums = Enumerable.Range(0, sizeof(int) * 8 - 1) .Select(i => (1 << i) & value)

我有一个以二进制数表示的配置值,允许在同一个值内有多个选项

例如,5的值应为101或同时为4和1


是否有人知道输入值“5”并获取返回的{1,4}列表的最佳/最快方法?

如果您想获取由以下值组成的2的幂:

int value = 5;
var addendums = Enumerable.Range(0, sizeof(int) * 8 - 1)
                          .Select(i => (1 << i) & value)
                          .Where(x => x != 0)
                          .ToList();
请注意,如果您想让加法器按降序排列,可以在筛选序列后应用反向

TL;DR第一步生成与整数值0、1、2、…、31中的位位置相对应的整数值。Max index是Int32值-1中的位数,因为我们需要位的索引

下一步选择按位AND运算的结果,1移位到与2的幂相同的相应索引,其值本身仅为此处显示的前4位:

i    1<<i     value           (1<<i) & value 
    Binary    Binary       Binary      Decimal
0    0001      0101         0001          1
1    0010      0101         0000          0
2    0100      0101         0100          4
3    1000      0101         0000          0
...
在这一步之后,您所要做的就是过滤掉零。

一些位移位,然后(&p)

天真的方法:

int originalInput = 42;
int input = originalInput;

// Generate binary numbers
var binaryNumbers = Enumerable.Range(0, 31).Select(n => (int)Math.Pow(2, n)).ToArray();

// Largest first
Array.Reverse(binaryNumbers);

var result = new List<int>();

foreach (var bin in binaryNumbers)
{
    if (input >= bin)
    {
        result.Add(bin);
        input -= bin;
    }
}

Console.WriteLine($"{originalInput} decomposed: " + string.Join(" ", result));

我做了这个小样品。这里你可以从一个整数中得到它的值,作为它的二次幂的和。Thosw电源应该是您的输入选项

class Program
    {
        static void Main(string[] args)
        {
            var input = 5;
            var options = new List<uint>();

            for (uint currentPow = 1; currentPow != 0; currentPow <<= 1)
                if ((currentPow & input) != 0)
                    options.Add(currentPow);

            foreach (var option in options)
                Console.WriteLine(option);

            Console.ReadLine();
        }
    }
输出为:14

编辑>>>事实上,这与@Sergey Berezovskiy答案相同,但没有LINQ


希望它能帮助

一个更传统、更容易理解的解决方案。将数字转换为字符串二进制表示形式,然后分析每个字符以提取1处每个位的相应十进制表示形式

int number = 5;
string binaryRep = Convert.ToString(number, 2);
List<int> myList = new List<int>();
int pow = 0;

for(int i = binaryRep.Count() - 1; i >= 0; i--)
{
    if(binaryRep[i] == '1')
    {
        myList.Add((int)Math.Pow(2, pow));  
    }

    pow++;
}
简捷:

int input = 5;
var list = new List<int>();

for (int i = 1, j = input; i <= j; i *= 2, input >>= 1){
    if ((input & 1) == 1) 
       list.Add(i);
}   

要显示二进制表示,请使用

 int value = 7;
 var binary = Convert.ToString(value, 2);
要查看二进制数,请执行以下操作:

    private int[] ToBinaryNumbers(int value)
    {
        var binary = Convert.ToString(value, 2).Reverse();
        int ix = 0;
        return binary.Select(x => { var res = x == '1' ? (int?)Math.Pow(2, ix) : (int?)null; ix++; return res; }).Where(x => x.HasValue).Select(x => x.Value).ToArray();
    }

这会给你7分1,2,4分,或者9分1,8分

你是说{4,1}因为4+1=5?所以如果我有12,我应该返回{8,4}?15={8,4,2,1}您的意思是布尔值列表?为什么不是3+2?甚至是1+2+2?您的选项是否存储为带有FlagsAttribute标记的枚举?那么这是开箱即用的。您可能希望在Where@aloisdg是的,我知道订单是从1点到2点15分。我相信这取决于OP将数字按降序排列:
int number = 5;
string binaryRep = Convert.ToString(number, 2);
List<int> myList = new List<int>();
int pow = 0;

for(int i = binaryRep.Count() - 1; i >= 0; i--)
{
    if(binaryRep[i] == '1')
    {
        myList.Add((int)Math.Pow(2, pow));  
    }

    pow++;
}
int input = 5;
var list = new List<int>();

for (int i = 1, j = input; i <= j; i *= 2, input >>= 1){
    if ((input & 1) == 1) 
       list.Add(i);
}   
 int value = 7;
 var binary = Convert.ToString(value, 2);
    private int[] ToBinaryNumbers(int value)
    {
        var binary = Convert.ToString(value, 2).Reverse();
        int ix = 0;
        return binary.Select(x => { var res = x == '1' ? (int?)Math.Pow(2, ix) : (int?)null; ix++; return res; }).Where(x => x.HasValue).Select(x => x.Value).ToArray();
    }