Leetcode---两整数之和--不用加减

两整数之和

题目链接:两整数之和
这道题出的其实意义不大,既然限制了使用加减直接运算,那是否限制整个运算过程中不可出现加减呢?如果限制,那基本上是实现不了的,当然,调用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);
    }

猜你喜欢

转载自blog.csdn.net/tiaochewang219/article/details/85690477