Lintcode 1、A + B 问题

题目描述

题目很简单,只是求出两个整数的和即可,但也存在特别的地方。就是让你不用普通的十进制计算问题,换成位运算的形式来计算。

解题思路

1、两个数的与运算得出两数相加需要进位的值
2、两个数的异或运算求出两数不进位加法的值
3、如此循环,当b的值为0时,运算结束

实现代码

注意:在该代码里,同时实现了减法、乘法和除法,相关思路根据代码注释。

package _test;

import java.util.Random;

public class Test001 {
    public static void main(String[] args) {
        /**
         * 位运算之加减乘除
         */
        int a = new Random().nextInt(100);//被除数远大于除数
        int b = new Random().nextInt(10) + 1;//避免除数为零
        System.out.println("随机数:" + a + " " + b);
        System.out.println("加法:" + add(a, b));
        System.out.println("减法:" + sub(a, b));
        System.out.println("乘法:" + multi(a, b));
        System.out.println("除法:" + div(a, b));
    }

    /**
     * 位运算实现加法运算:
     * 1、异或运算得出不进位加法的值
     * 2、与运算得出加法运算中需要进位的值,通过<<1可复位
     * @param a
     * @param b
     * @return
     */
    public static int add(int a, int b){
        if (b == 0){
            return a;
        }
        //运算中需要进位的值
        int carry = (a & b) << 1;
        //不进位加法的值
        a = a ^ b;
        return add(a, carry);
    }

    /**
     * 位运算实现减法运算
     * @param a
     * @param b
     * @return
     */
    public static int sub(int a, int b){
        //计算原理:a - b = a + (~b + 1)
        b = ~ b + 1;
        return add(a, b);
    }

    /**
     * 位运算实现乘法运算
     * @param a
     * @param b
     * @return
     */
    public static int multi(int a, int b){
        int index = 0;//确定a需要移动的位数
        int result = 0;//声明返回的变量
        while (b != 0){
            //判断b的最低位是否为1
            if ((b & 1) == 1){
                result = result + (a << index);
            }
            //将b进行变化
            b = b >> 1;
            //记录当前需要移动的位数
            index++;
        }
        return result;
    }

    /**
     * 位运算实现除法运算
     * @param a
     * @param b
     * @return
     */
    public static int div(int a, int b){
        //当被除数小于除数即停止
        if (a < b){
            return 0;
        }
        //利用除法转换为减法的思想:存在一个除数即可为商加1
        int res = div(sub(a, b), b) + 1;
        return res;
    }
}

发布了28 篇原创文章 · 获赞 5 · 访问量 2187

猜你喜欢

转载自blog.csdn.net/qq_40307379/article/details/104884939
今日推荐