[编程题]-[位运算技巧系列]不用加减乘除做加法

8、[位运算技巧系列]不用加减乘除做加法

^(异或) 知识点:(同为0,异为1)

0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0

其他

image-20200620131521927

如何左移

左移操作就是最高位抛弃 后的每一位向左前进一位, 最后一位补0

如:

101

左移1位:101-->>先补全四位0101 --->>抛弃最高位0,且后边补一位 1010

再左移1位:1010---->>0100

再左移1位:0100---->>1000

再左移1位:1000---->>0000

解体思想:

image-20200620131050666

代码:

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;
    }
}

猜你喜欢

转载自www.cnblogs.com/jiyongjia/p/13191839.html