当前位置:   article > 正文

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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/175540?site
推荐阅读
相关标签
  

闽ICP备14008679号