题目
整数转换。编写一个函数,确定需要改变几个位才能将整数A转成整数B。
示例1:
输入:A = 29 (或者0b11101), B = 15(或者0b01111)
输出:2
示例2:
输入:A = 1,B = 2
输出:2
提示:
A,B范围在[-2147483648, 2147483647]之间
解题思路
1.^异或运算,数1的个数
- 但是这个方法有个注意点就是:如果遇到826966453 与 -729934991这种一正一副的数,那么最高位异或运算会变成1!这个样子的话得到一个副值,如果用移位操作的话,-1>>1等于-1会陷入死循环!
- 我这里做的是判断一下异或结果如果为负数,那么就跟Integer.MAX_VALUE进行与操作,数一下除了最高位的1以外还有多少1存在,最后返回的时候+1就好。
代码:
class Solution {
public int convertInteger(int A, int B) {
int a = A ^ B;
int sum = 0;
if (a<0){
int b = a & Integer.MAX_VALUE;
while (b!=0){
if (b%2==1){
sum++;
}
b = b>>1;
}
return sum+1; //注意这里加1的意思是返回最高位,表示符号为的1
}else{
while (a != 0){
if (a%2==1){
sum++;
}
a = a>>1;
}
return sum;
}
}
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(s.convertInteger(826966453, -729934991));
}
}
性能:
1.2位运算
代码思路:
- 不用分异或结果是正是负!
- 因为二进制的补码缘故,写几次就会发现,无论是征服,只要对数进行-1操作,就能改变二进制从低位到高位的第一个1的值。然后每次a = a&(a-1);,每次就可以消掉最低位的1,就可以数出到底有多少个1存在。
- 有点抽象,建议还是写个例子比如 21 & 20…
class Solution {
public int convertInteger(int A, int B) {
int a = A ^ B;
int sum = 0;
while (a != 0) {
sum++;
a = a&(a-1);
}
return sum;
}
}
性能:
- 少创建了个变量…但其实都是O(1)的空间复杂度