只用位运算实现两数相加(考虑负数)
//整个程序没有出现+ - * /
import java.util.*;
public class Solution {
public static int Add(int num1,int num2) {
int bit1 = 0;
int bit2 = 0;
int tmp = 0;//当前位计算结果
int forward = 0;//进位记录
ArrayList<Integer> ret = new ArrayList<>();//list记录每一位
while(num1!=0&&num2!=0){
bit1 = num1 & 1;
bit2 = num2 & 1;
if(bit1==1&&bit2==1){
tmp = forward;//当前位等于上一位的进位
forward = 1;
}else if((bit1==1||bit2==1)){
if(forward==1){
tmp = 0;
forward = 1;
}else{
tmp = 1;
forward = 0;
}
}else{//bit1==0,bit2==0
tmp = forward;
forward = 0;
}
ret.add(tmp);
num1 >>>=1;//这里一定要用不带符号位的右移否则跳不出循环的!
num2 >>>=1;
}
//剩余位处理,还有进位要处理的
if(num1!=0){
while(num1!=0){
bit1 = num1&1;
if(bit1==1&&forward==1){
tmp=0;
forward = 1;
}else{
tmp = bit1 | forward;
forward = 0;
}
ret.add(tmp);
num1 >>>=1;
}
}
if(num2!=0){
while(num2!=0){
bit2 = num2&1;
if(bit2==1&&forward==1){
tmp=0;
forward = 1;
}else{
tmp = bit2 | forward;
forward = 0;
}
ret.add(tmp);
num2>>>=1;
}
}
if(forward == 1){
ret.add(1);
}
Collections.reverse(ret);//翻转list方便移位还原整数;
int ans = 0;
for(Integer i : ret){
ans <<=1;
ans |= i;
}
return ans;
}
}
//简洁版本
public class Solution {
public int Add(int num1,int num2) {
int and = (num1&num2)<<1;//相与为1的位是需要进位的,所以直接左移一位
int or = num1^num2;//异或为1的位是一定等于1的位
while((and&or)!=0){//进完位的位,与异或为1的位相加需不需要进位?需要就继续循环,不需要就加完啦~
int tmp1 = and;
int tmp2 = or;
and = (tmp1&tmp2)<<1;
or = tmp1^tmp2;
}
return and|or;//最后返回不需要进位的and|or的值,即他们的和,这里用异或也行啊,这里用^或者|都行,但是^更快
}
}