算法与数据结构(一)

做了几年的CRUD,一直忽略了底层原理,重整心情,慢慢地做回自己吧。

算法与数据结构是一个开发者的思想基础,潜移默化地影响你的编程。

下面先由一个问题来引出今天的话题:如何快速判断一个大于0的整数是不是2的次方数?(例如:4是2的2次方,所以4是2的次方数;16是2的4次方,所以16也是2的次方数;同理8也是,32也是。。。)

如果用java或者C++ 写一个函数来解答这个问题,大家头脑中第一个想法是什么,有没有人想到通过while循环来实现,或许大部分人都会这样做:

public static boolean calculate(int num){
    while(num%2==0){
        num/=2;
    }
    if(num==1){
        return true;
    }else{
        return false;
    }
}

但我们知道计算机底层运算都是二进制数 的运算,取模运算和除以2运算会影响运算效率。

下面的这种运算方式会更高效:

我们知道2的二进制数是10,4的二进制数是100,8的二进制数是1000,16的二进制数是10000......,有没有找到规律。然后我们知道1的二进制数是1,我们在它前面补一个0,就是01;同样,3的二进制数是011,7的二进制数是0111;15的二进制数是01111.....。我们还知道 两个数的与运算(&),二进制位相同得1,同理可得,2&1值为0,4&3值为0,8&7值为0,16&15值为0.....

于是我们有了下面的函数:

public static boolean calculate(int num){
    if((num&(num-1))==0){
        return true;
    }else{
        return false;
    }
}

函数体还可以简写成三目运算符的形式:

return ((num&(num-1))==0);

(由于运算符优先级的问题,记得带括号)

这样的写法不仅仅是代码行数的减少,更是底层运算效率的提升。

结语:今天先写到这里,明天为大家分享我学习arraylist数组实现的心得体会。加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值