如何使用C#提取构成目标数的2的幂次整数列表?
嘿,这个问题其实就是把数字拆解成它的二进制表示里所有为1的位对应的2的幂次嘛!我给你分享两种在C#里实现的实用方法,都很好理解:
方法一:位运算遍历法(高效首选)
这个思路利用了二进制的本质,直接通过位运算检查每一位是否为1,是效率最高的方式:
public static List<int> GetPowerOfTwoComponents(int target) { var components = new List<int>(); int currentPower = 1; // 从2^0开始,也就是1 while (currentPower <= target) { // 按位与操作:如果当前位是1,结果不为0 if ((target & currentPower) != 0) { components.Add(currentPower); } // 左移一位,等价于currentPower *= 2,得到下一个2的幂次 currentPower <<= 1; } // 如果需要从大到小排序,就加上这行 // components.Reverse(); return components; }
思路解释
比如输入23,它的二进制是10111,我们从最低位(2^0=1)开始检查:
- 23 & 1 = 1 ≠ 0 → 加入1
- 23 & 2 = 2 ≠ 0 → 加入2
- 23 & 4 =4 ≠0 → 加入4
- 23 &8=0 → 跳过
- 23&16=16≠0 → 加入16
最后得到的列表就是[1,2,4,16],如果需要从大到小排列,调用Reverse()就行。
方法二:二进制字符串解析法(直观易懂)
如果你对位运算还不太熟悉,这种方法更直观——把数字转换成二进制字符串,再逐个找'1'的位置计算对应的幂次:
public static List<int> GetPowerOfTwoComponents(int target) { var components = new List<int>(); // 把数字转成二进制字符串,比如23会变成"10111" string binaryStr = Convert.ToString(target, 2); // 从字符串末尾往前遍历(因为字符串最左边是最高位,最右边是2^0) for (int i = binaryStr.Length - 1; i >= 0; i--) { if (binaryStr[i] == '1') { // 计算当前位对应的2的幂次 int exponent = binaryStr.Length - 1 - i; int power = (int)Math.Pow(2, exponent); components.Add(power); } } return components; }
测试示例
你可以直接调用方法测试:
// 测试输入23 var parts23 = GetPowerOfTwoComponents(23); // 结果:[1,2,4,16](或反转后的[16,4,2,1]) // 测试输入19 var parts19 = GetPowerOfTwoComponents(19); // 结果:[1,2,16](或反转后的[16,2,1])
内容的提问来源于stack exchange,提问作者pantonis
相关产品推荐
相关产品推荐

