位运算实现简单的加减乘除

所有的数据在计算机中都以二进制的形式存储,对二进制的运算叫做位运算,即符号位共同参与运算的运算。

基本形式:

&  与:仅当两个位都为1时,结果为1;

|   或 :两个位有一个位为1时,结果就为1,仅当两个位都为0时,结果为0;

~  非 :位为0,结果为1,位为1,结果为0;

^   异或:两个位相同为0,不同为1;

<< 左移:二进位全部左移若干位,高位丢弃,低位补0(因为十进制左移一位相当于乘10,所以二进制左移一位相当于十进制的乘2);

>> 右移:各二进位全部右移若干位,对无符号数,高位补0,对于有符号数,算数右移需要补1,逻辑右移需要补0;

利用位运算实现加减乘除:

代码如下:

    public int aplusb(int a, int b) {
        // write your code here
        //1.判断加数是否为0;
        if (b==0) {
            return a;
        }
        //2.求出不考虑进位的得数
        int sum =a^b;
        //3.求出只考虑进位的得数
        int carry=(a&b)<<1;
        //递归
        return aplusb(sum, carry);
    }
 public int minus(int a,int b){
        /*/
        计算机中并没有单独的设置一个减法器,而是通过转换刚才的加法器来实现减法
        而所谓的减法就是加一个负数,实现方案是取反加一
         */
        //1.调用加法器,加数转换为负数 ~:按位取反,
        int subtractor=aplusb(~b, 1);
        int result =aplusb(a, subtractor);
        return result;
    }
public int multiply(int a,int b){
        //去两个乘数的绝对值
        int multiplicand =a<0?aplusb(~a,1):a;
        int multiplier =b<0?aplusb(~b, 1):b;
        int result = 0;
        //对于乘法而言,不过就是加上多少次
        for (int i=0;i<multiplier;i++){
           result= aplusb(result, multiplicand);
        }
        //这里是判断结果的符号,负数不过是取反加一
        if ((a^b)<0){
            result=aplusb(~result, 1);
            return result;
        }
           return result;

    }
    public int divide(int a,int b){
        /*
         相比于乘法,除法也不过是计算a-b减了几次罢了
         */
        int dividend=a>0?a:aplusb(~a, 1);
        int divisor=b>0?b:aplusb(~b, 1);

        int i=0;
        while (divisor<=dividend){
           dividend=minus(dividend, divisor);
           i=aplusb(i, 1);
        }
        if ((a^b)<0){
            return aplusb(~i, 1);
        }
        return i;
    }

以上,借鉴的很多

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值