Lintcode181——将整数A转换为B

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DdogYuan/article/details/82915822

题目描述

描述
如果要将整数A转换为B,需要改变多少个bit位?

Both n and m are 32-bit integers.

您在真实的面试中是否遇到过这个题?  
样例
如把31转换为14,需要改变2个bit位。

(31)10=(11111)2

(14)10=(01110)2

初始思路

两个数异或之后得到数t(例如样例中t为10001)
问题转换为判断t中有多少个1
可以通过移位运算来判断,方法如下:
设置一个flag为1,判断flag&t是否为1,为1则认为当前位是1,然后将t右移1位并判断t是否为0,不为0则继续while循环

出现的问题和原因

提交之后出现的问题
可以发现,如果是右移t,则当t是负数的时候,左边为补符号位,即补1,导致了while循环无法终止。回顾一下移位运算符

移位运算符

移位运算符有双目移位运算符:<<(左移)和>>(右移)。左移运算是将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补0。右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补0,或者补符号位,这由不同的机器而定。

解决办法

我们不右移t而是左移flag,并由flag是否为0来终止while循环。

//提交通过
class Solution {
public:
    /**
     * @param a: An integer
     * @param b: An integer
     * @return: An integer
     */
    int bitSwapRequired(int a, int b) {
        // write your code here
        int t = a^b;//异或得到t,然后判断t中有几个1
        int flag = 1;
        int count = 0;//需要改变的bit数量
        while(flag!=0){
            if((t&flag)!= 0){
                count++;
            }
            flag<<=1;
        }
        return count;
    }
};

猜你喜欢

转载自blog.csdn.net/DdogYuan/article/details/82915822
今日推荐