数据结构与算法大厂实战真题第3题:找到>=num,并且离num最近的,2的某次方

给定一个非负整数num

如何不用循环语句,

返回>=num,并且离num最近的,2的某次方

这个如果使用循环或者递归方法很容易解决,但是如果不用循环语句的话怎么办呢

package dataStructure.bigFactory;

/**
 * 给定一个非负整数num,
 * 如何不用循环语句,
 * 返回>=num,并且离num最近的,2的某次方
 */
public class NextPowerOfTwo {
    public static int getNextPowerOfTwo(int num) {
        num = num - 1;
        //这一步是把num的第一个1的下一位也变成1(第一个1开始2位都是1)
        num |= num >>> 1;
        //这一步是把num的第一个1的往后的三四位都变成1(第一个1开始的4位都是1)
        num |= num >>> 2;
        //这一步是把num的第一个1的往后的五六七八位都变成1(第一个1开始的8位都是1)
        num |= num >>> 4;
        //这一步是把num的第一个1的往后的9~16位都变成1(第一个1开始的16位都是1)
        num |= num >>> 8;
        //这一步是把num的第一个1的往后的17~32位都变成1(第一个1开始的32位都是1)
        num |= num >>> 16;
        //这些变1的过程中如果出现了最高位为1的情况,说明变成了负数了
        return num + 1 <= 0? 1 : num + 1;
    }

    public static void main(String[] args) {
        int num = Integer.MAX_VALUE;
        int nextPowerOf2 = getNextPowerOfTwo(num);
        System.out.println(nextPowerOf2);
    }
}

里面重点的语句都有详细的注释,我们画图模拟一下这个过程,先来个简单的

随意找个复杂的数

 

n>>>1是把num的第一个1的下一位也变成1(第一个1开始2位都是1)

n>>>2是把num的第一个1的往后的三四位都变成1(第一个1开始的4位都是1)

n>>>4是把num的第一个1的往后的五六七八位都变成1(第一个1开始的8位都是1)

n>>>8是把num的第一个1的往后的9~16位都变成1(第一个1开始的16位都是1)

n>>>16是把num的第一个1的往后的17~32位都变成1(第一个1开始的32位都是1)

int类型只有32位,第一位是符号位,我们这里是正数,所以第一个1顶多出现在31位,不过无所谓了。

注意最后返回的时候的边界处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值