2017-10-20 40 views
-1

我正在尝试编写接收整数作为输入并返回2的幂整数列表的ac#方法其总和等于输入整数将整数转换为按位后的个别幂的计算,其总和等于输出整数之和

例如

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 

我可以知道一个好办法做到这一点?

+0

回答你将如何检查是否有点'N'您输入的整数为1?为所有32个可能的位(提示:循环)做到这一点,你有你的答案。试一试,如果遇到问题,向我们展示代码并询问具体问题。 – oerkelens

+1

给'BitArray'[机会](https://stackoverflow.com/questions/6758196/convert-int-to-a-bit-array-in-net)并根据需要格式化输出 – lokusking

+0

请显示一些(不)你尝试过的工作代码。并开始看[如何问](https://stackoverflow.com/help/how-to-ask) –

回答

0

我通过评论

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

该数字的二进制表示形式上是一个2的幂的位图,其和为该数字的和。简单地遍历从LSB到MSB的这些位,为设置为1的每个位发出适当的字符串。

0

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

执行此操作的常用方法通常是将除法的模除以2,然后除以2 - 循环。

+0

该方法适用于广义基础转换。但对二进制来说,使用按位运算符要快得多。 –

+0

但这正是按位操作所做的。无论如何,可能所有当代编译器都将优化除以2和将模2优化为它们各自的按位操作。在大多数情况下,它不再需要提供特定的优化解决方案。 –

+0

不幸的是,除以2和模2不等于按位运算。一个好的编译器会试图证明替换是否被允许,但是证明是否成功受到语言规则的强烈影响。如果查看位是你想要的,写出按位操作。 –

相关问题