赞
踩
题目链接:两整数之和
这道题出的其实意义不大,既然限制了使用加减直接运算,那是否限制整个运算过程中不可出现加减呢?如果限制,那基本上是实现不了的,当然,调用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); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。