编程之美之课后练习(一)

    今天是中秋假期的第二天,上午打了一上午的炉石,买了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个数的方法,这个大家就可以自己去看了,我贴的都是效率比较高的方法。最后,祝大家中秋节玩的开心!



你可能感兴趣的:(java)