2.只用位运算不用算法运算实现整数的加减乘除运算

  • 题目

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

  • 思路(加法)

结论性思路:

1.不考虑进位------>a^b就是正确答案。其中^是异或操作,即相同=0,不同=1

举例1:0+1=1

二进制:0000+ 0001=0001          0^1=1

举例2:7+5=12

不进位情况下,7+5个位数为2,0111^0101=0010  换成十进制也就是2

2.只算进位的情况下,即a+b进位时产生的值是什么时------>(a&b)<<1

举例:7+5=12

进位情况下,7+5十位数为10,0111&0101=0101    0101<<1=1010 换成十进制也就是10

  • 以7+5为例

1)0111^0101=0010=2    0111&0101=0101<<1=1010=10

2)  0010^1010=1000=8    0010&1010=0010<<1=0100=4

3)  1000^0100=1100=12    1000&0100=0000<<1=0000=0

当(a&b)<<1最终=0时停止,最后得到结果12

  • 代码(加法的实现)
public class Solution {
    public int add(int num1,int num2) {
        int sum = num1;
        while(num2!=0){
            sum = num1 ^ num2;
            num2 = (num1 & num2)<<1;
            num1 = sum;
        }
        return sum;
    }
}
  • 思路(减法)

实现a+b,只要实现a+(-b)就可以了

结论性小结:一个数的相反数,是这个数的二进制数表达取反+1(补码)的结果。(即相反数=二进制补码)

  • 代码(减法的实现)
//~n是给的数进行取反,之后调用前面给的add函数执行+1的操作,得到的结果相当于-b
public int negNum(int n){
    return add(~n, 1);
}
//计算a+(-b)
public int minus(int a, int b){
    return add(a, negNum(b));
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值