两整数之和
题目链接:两整数之和
这道题出的其实意义不大,既然限制了使用加减直接运算,那是否限制整个运算过程中不可出现加减呢?如果限制,那基本上是实现不了的,当然,调用java自身的库函数除外
这里我给出的解答,没有直接使用加减运算,而是使用“异或”和“与”运算,整个运算过程中使用了自增运算
思路:
限制直接使用加减,只能通过与运算解决,分析:如0101B+0110B
使用位运算,那么就要每一位单独去运算,所以需要循环32次,期间要考虑进位的问题,初始进位为0
从低位到高位,取出每一位异或,当结果为1时,只需判断进位,进位为0,则新的进位仍为0,进位为1,则新的进位仍为1,所以这里不必单独考虑
当结果为0时,两种可能0^0 和 1 ^1,通过判断是1,还是0来决定进位是1或0
结果我是以字符串的形式保存的,再通过进制转换成十进制,这里需要注意的是,结果为负时,存的是补码形式,而进制转换不会自动识别正负,所以仍然需要单独考虑
public static int getSum(int a, int b) {
//将ab异或
int temp = a^b; //这是异或结果
int bit = 0; //这是每一位异或的结果
int over = 0; //这是进位
StringBuffer res = new StringBuffer();
for(int i=1;i<=32;i++) {
//对异或结果取最低位
bit = temp&1;
//bit取0 ,可能同为1或同为0
res.insert(0, (bit^over));
if(bit==0) {
if((a&1)==0) {
//同为0
over = 0; //进位置0
}else {
//同为1
over = 1; //进位置0
}
}
a = (a>>1);
temp = (temp>>1);
//bit=1的情况说明一个为1,一个为0,则看over,over为1产生进位,否则无进位,即over值不变
}
// System.out.println(res.toString());
if(res.charAt(0)=='1') {
//说明是负数
int i = 0;
for(char val:res.toString().toCharArray()) {
res.setCharAt(i++, val=='0'?'1':'0');
}
return ~(Integer.parseInt(res.toString(),2));
}
return Integer.parseInt(res.toString(),2);
}