注释超详细的位运算实现加法,看一遍就会
时间复杂度 O(logn);
C++ 代码
class Solution {
public:
int add(int num1, int num2){
for(int i=1;i;i<<=1){
if( i & num2 ){ // 将num2 分解成由2的整数次幂表示的数, 也就是将num2 的二进制位每一位从低到高分离出来用于相加
for(int j=i;j;j<<=1){ // j
if(j & num1){ // 这里是进入循环的第一次看是否从num2取出来的数j 对应在num1 的二进制位上有数,有的话就改变这一位(实现了不进位加法)
num1 = num1 ^ j;
}
else{ // 这里就是实现进位加法了,j是依位寻找进位的地方,找到了就于j 或运算,进行进位,这也就是说这次相加运算就结束了
num1 = num1 | j;
break; // 进位完毕进入 从num2分离的下一个数字 的相加运算
}
}
}
}
return num1;
}
};
说明:一般第二次循环的第一次或者几次就会找到相应的进制位了,
我们可以思考:将num2 分成为2的整数位的一些小的数字,这些数字用二进制表示只有一位哦。
所以二重循环的第一次循环如果num1 的当前位是0 就表是这里就是要加到地方,直接进位(程序中就是进入else里面)
如果num1 的当前位不为0 ,就表示这里不是进位的地方,一直循环下去,一直到num1 的第一位0处 进行进位。