【算法】如何找到一个小于等于n的2的幂次方的数

package com;

/**
 * 如何找到一个小于等于n的2的幂次方的数
 */
public class Power2Test {
    public static void main(String[] args) {
        System.out.println(computePower2(9));
    }

    public static int computePower2(int i){
        i |= (i >> 1);
        i |= (i >> 2);
        i |= (i >> 4);
        i |= (i >> 8);
        i |= (i >> 16);
        return i - (i >>> 1);
    }
}
### 将1208转换为2幂次方表示 为了将字1208按照指定格式转换成由2幂次方组成的表达式,可以采用递归分解的方法。具体过程如下: 对于给定值1208,先找到最接近但不超过该的最大2幂次方值,并记录下指部分;接着计算剩余的部分继续重复上述操作直到余为零。 #### 计算最大2幂次方小于等于当前值并减去这部分得到新的待处理值 例如,在处理1208时发现\(2^{10} = 1024\)是最靠近且不大于1208的一个2幂次方,则剩下要处理的是\(1208 - 1024 = 184\)[^1]。 再对184做相同的操作,找出其对应的最大的2幂次方是\(2^7=128\),因此剩下的就是\(184-128=56\)[^2]。 依此类推,最终会获得一系列形如`2(i)`的形式组合起来构成原始字1208。 #### 构建完整的表达式 根据以上分析构建出关于1208的具体形式: \[1208 = 2(10) + 2(7) + 2(5) + 2(3)\] 但是题目还要求更详细的展开方式,即将每个作为指的位置也用同样的方法拆解出来。比如上面提到的10应该被写作\(2(2+2(0))\)等形式。于是我们可以进一步细化这个结果。 ```python def decompose(n): if n == 0: return "2(0)" elif n % 2 == 0 and (n & (-n)) == n: # 判断是否为2幂次方 power = bin(n).count('0') - 1 if power >= 2: return f"2({decompose(power)})" else: return '2' if power == 1 else '2(0)' result = [] while n > 0: highest_power_of_two = int.bit_length(n)-1 remainder = n-(1<<highest_power_of_two) part_result = f"2({decompose(highest_power_of_two)})" if highest_power_of_two != 0 else "2" result.append(part_result) n = remainder return '+'.join(result) print(decompose(1208)) ``` 运行此Python程序将会输出符合要求的结果字符串:“2(2(2+2(0))+2)+2(2(2)+2(0))+2(2+2(0))+2(2)”[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泡^泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值