C# 将二进制数5转换为整数列表(4,1)
我有一个以二进制数表示的配置值,允许在同一个值内有多个选项 例如,5的值应为101或同时为4和1C# 将二进制数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”并获取返回的{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();
}