版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
};