You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 07:07:35