加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

java实现加减乘除法

(2018-10-06 11:18:41)
标签:

求职面试经典算法

实现加减乘除法

数据结构与算法

leetcode

java

分类: 求职面试算法

阿里蚂蚁金服的面试中出现:要求手写实现“乘除法”

快手的面试中曾出现:使用位运算实现整数加法运算

 


public class BinaryOperation {

    public static void main(String[] args) throws Exception {
        System.out.println(binaryAdd(-6-15));
        System.out.println(binaryMulti(56));
        System.out.println(binaryMulti2(56));
        System.out.println(binaryDiv(63));
    }

    private static int binaryAdd(int a, int b) {// 正负数都包含在里面,不用分开处理
        int b;// 不考虑进位的和
        int jw b;// 进位

        // 下面是 (jw<<1) 的计算
        while (jw != 0{
            int jw_temp (jw << 1);// 保存s (jw<<1)的进位
            (jw << 1);// 保存s (jw<<1)的和,不包含进位
            jw jw_temp;// 赋值之后,还是计算s+(jw<<1),依旧是计算:进位以及不进位的和,当进位为0时,不进位的和就是最终的计算结果
        }
        return s;
    }

    private static int binaryMulti(int a, int b) {// 计算a*b
        if (a == 0 || == 0)
            return 0;

        int res 0;
        int base a;
        while (b != 0{
            if ((b 1!= 0)
                res binaryAdd(res, base);
            >>= 1;
            base <<= 1;
        }

        return res;
    }
    private static int binaryMulti2(int a, int b) {// 计算a*b
        if (a == 0 || == 0)
            return 0;

        if(b>a) {
            int tmp a;
            b;
            tmp;
        }
        int res 0;
        int shift 0;
        while(b!=0{
            if((b&1)!=0{
                res += (a<<shift);
            }
            shift += 1;
            >>= 1;
        }
        return res;
    }

    private static int binaryDiv(int a, int b) throws Exception {// 计算a/b
        if (b == 0)
            throw new Exception("分母不能为0");

        boolean flag false;
        if ((a b) 0)
            flag true;// 表示a,b异号;
        >= 0 -a;
        >= 0 -b;

        int res 0;
        int aux 0;//依次获取a的最高位
        int mask 0x40_00_00_00;// 用来依次获取分母的最高位bit
        while (mask != 0{
            aux (aux << 1((a mask) == 0 0 1);// 这里注意处理,尤其是后半部分表达式,很容易写成aux
                                                         // (aux<<1) |
                                                         // (a&mask);

            if (aux >= b) {
                res (res << 11;
                aux -= b;
            else {
                res (res << 10;
            }

            mask >>= 1;

        }

        return flag -res res;
           
}

http://s1/mw690/003t1wtazy7ocYAfd4Ia0&690

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有