zoukankan      html  css  js  c++  java
  • [编程题]-[位运算技巧系列]不用加减乘除做加法

    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;
        }
    }
    
  • 相关阅读:
    python限定方法参数类型、返回值类型、变量类型等
    双拼自然码
    关于将汉语拼音字母“ü”改成“v”的设想和建议
    数据库转模型图
    python中的捕获异常、异常跟踪
    内部教师爆料:某些民办学校真正的内幕
    炸薯条
    IntelliJ IDEA添加JavaDOC注释 方法 快捷键
    java获取当前路径的方法
    java获取全部子类或接口的全部实现
  • 原文地址:https://www.cnblogs.com/jiyongjia/p/13191839.html
Copyright © 2011-2022 走看看