8、[位运算技巧系列]不用加减乘除做加法
^(异或) 知识点:(同为0,异为1)
0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0
其他
如何左移
左移操作就是最高位抛弃 后的每一位向左前进一位, 最后一位补0
如:
101
左移1位:101-->>先补全四位0101 --->>抛弃最高位0,且后边补一位 1010
再左移1位:1010---->>0100
再左移1位:0100---->>1000
再左移1位:1000---->>0000
解体思想:
代码:
package jianzhioffer;
import demo05.Main;
/**
* @author jiyongjia
* @create 2020/6/20 - 13:00
* @descp:
*
* > **知识点:(同为0,异为1)**
* 0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0
*
* > **如何左移**
* 左移操作就是最高位抛弃 后的每一位向左前进一位, 最后一位补0
* 如:101
* 左移1位:101-->>先补全四位0101 --->>抛弃最高位0,且后边补一位 1010
* 再左移1位:1010---->>0100
* 再左移1位:0100---->>1000
* 再左移1位:1000---->>0000
*/
public class P8_Add {
public static void main(String[] args) {
int add = Add(111, 899);
System.out.println(add);
System.out.println(111+899);
}
public static int Add(int num1, int num2) {
int s1;
int s2;
do {
//1 不考虑进位的情况下,对两数相加就是异或操作(同为0,不同为1)
s1 = num1 ^ num2;
//2 考虑进位相加的二进制结果是两数与,再左移位
s2 = (num1 & num2) << 1;
num1 = s1;
num2 = s2;
/*这里的结束标志的理解:如果不进位的i情况下s2操作肯定是结果为0的,进位就
说明还得递归迭代,如 101+010 结果肯定是000,无进位的,左移也是000.但是,对于101+111 ,结果有进位,肯定是还需循环*/
} while (num2 != 0);
//推出循环,返回值即可
return num1;
}
}
力扣的注释
class Solution {
/**
思路:step1 = a ^ b;//得出无进位的相加的值
step2 = (a & b) << 1; //得出进位后的相加的值
那么res = step ^ step2 (即step1+ step2);此时,在这一步仍然可能会进位的,所以,我们调用递归处理,直到没进位了,就是我们的结果
*/
public int add(int a, int b) {
int step1;
int step2;
do{
step1 = a ^ b;//得出无进位的相加的值
step2 = (a & b) << 1; //得出进位后的相加的值
//重新赋值回去,让执行step1,step2操作
a = step1;
b = step2;
}while(b!=0); //因为无进位的两数相加经过step2计算必为0
//如果没进位了,得到的异或的值step1就是我们需要的结果
return a;
}
}