C# 将整数转换为其和等于输出整数之和的位后,计算2的各个幂

C# 将整数转换为其和等于输出整数之和的位后,计算2的各个幂,c#,bitwise-operators,C#,Bitwise Operators,我试图编写一个c#方法,它接受一个整数作为输入,并返回一个整数列表,这些整数是2的幂,其和等于输入整数 比如说 Input Integer :15 Output of this should be 1(2^0), 2 (2^1), 4 (2^2), 8 (2^3) Sum of above integers is 15 = Input Integer Input Integer :13 Output of this should be 1(2^0), 4 (2^2), 8 (2^3) Sum

我试图编写一个c#方法,它接受一个整数作为输入,并返回一个整数列表,这些整数是2的幂,其和等于输入整数

比如说

Input Integer :15
Output of this should be 1(2^0), 2 (2^1), 4 (2^2), 8 (2^3)
Sum of above integers is 15 = Input Integer


Input Integer :13
Output of this should be 1(2^0), 4 (2^2), 8 (2^3)
Sum of above integers is 13 = Input Integer


Input Integer :8
Output of this should be: 8 (2^3)
Sum of above integers is 15 = Input Integer

我可以知道一个好方法吗?

数字的二进制表示形式实际上是2的幂和该数字的位图。只需从LSB到MSB对这些位进行迭代,为设置为1的每个位发出相应的字符串。

通常,您需要数字的二进制表示形式。输出是表示有位置的位置列表(向后计数)


实现这一点的常用方法通常是检查除法的模除以2,然后在循环中除以2。

我通过注释得到了答案

            var bits = new BitArray(BitConverter.GetBytes(12));
            List<Double> restrictedList = new List<Double>();
            for(int i=0;i<bits.Count;i++)
            {
                if (bits[i]==true)
                {
                    restrictedList.Add(Math.Pow(2, i));
                }
            }
var bits=新的位数组(BitConverter.GetBytes(12));
            List restrictedList=新列表();

            对于(int i=0;i如何检查输入整数的位
n
是否为1?对所有32个可能的位(提示:循环)执行该操作,您就有了答案。尝试一下,如果遇到问题,请向我们展示代码并询问具体问题。请给出“BitArray”a并根据需要格式化输出,显示一些(不是)您尝试过的工作代码。开始查看@lokusking获得了我的答案。谢谢您不要为您的问题添加解决方案。问题是一个问题。答案和解决方案如下。解决方案由Dolt发布-嘿,是您-没关系。但是,保留它作为答案,当宽限期到期时,选择一个答案并将其标记为Accepted。如果它看起来不错和/或其他答案没有帮助,它甚至可能是你的答案。这种方法适用于广义基转换。但对于二进制,只使用位运算符要快得多。但这正是位运算所做的。可能所有当代编译器都会优化2除和模运算不管怎样,o乘2到它们各自的位运算。在大多数情况下,不再需要提供特定的优化解决方案,因为它不再更快。不幸的是,除以2和模乘2并不等同于位运算。一个好的编译器会尝试证明是否允许替换,但证明是否成功是不可能的长期受语言规则的影响。如果你想看位,就写位运算。整数除以2(我们在这里讨论)完全等同于位右移(除非我们考虑负数)。模2也是位运算(取最低有效位)。我不知道你所说的“不相等”是什么意思。除非我们考虑到负数。这就是问题所在。编译器会(考虑到负数)。