<中秋节番外>编程之美之课后练习(一)

本文介绍了一种高效算法,用于计算两个整数在二进制表示下不同位的数量。通过异或运算找到不同位,并使用巧妙的方法计算这些位的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    今天是中秋假期的第二天,上午打了一上午的炉石,买了30元十包的新手包,毫不意外地啥也没开出来......好了,言归正传。今天的习题是这样的:给定两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位(bit)?也就是说,整数A和B的二进制表示中有多少位是不同的?

    解决这个问题的思路应该分两步走:

(1)找到A和B中所有不同的位;

(2)将找到的不同的位进行计数。

    第(1)步是非常好办的,我们只需要将A和B进行“异或”操作,得到的结果中所有1代表的位就是A和B不同的位。第(2)步也是非常简单,只要你看过编程之美的话,我们可以通过如下方法非常快速地找出一个int型数中所有1的个数,代码如下:

    public static int numOfOneInBits3(int origin){
        int num = 0;
        while (origin!=0){
            origin &= (origin-1);
            num ++;
        }
        return num;
    }
    这里最难理解的可能就是origin &= (origin-1)这句话,这句话可以消除origin处于最低位的1。例如,origin=10,即二进制形式为1010,那origin和origin-1进行“与”操作后,即1010&1001=1000,我们发现左侧的1已经被消除了。继续进行该进程,1000&0111=0000,右侧的1也被消除了。此时,origin=0,退出循环,我们就得到了最终结果2,即10的二进制形式中包涵两个1。

    我们利用这个方法就可以快速解决步骤(2),综合步骤(1)步骤(2)我们就得到如下代码:

    public static int findMinDifference(int a, int b){
        int temp = a ^ b;
        int num = 0;
        while(temp!=0){
            temp &= (temp-1);
            num++;
        }
        return num;
    }
    编程之美上当然还介绍了其他一些求1个数的方法,这个大家就可以自己去看了,我贴的都是效率比较高的方法。最后,祝大家中秋节玩的开心!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值