【牛客网】JZ65:不用四则运算符实现两数相加

问题来源

牛客网数据结构题目👉JZ65

题目要求如图

image-20220205123407921


思考

不能使用四则运算,根据过往的学习经历,我唯一能想到的就是位操作符和移位操作符

例:使用位操作符进行int变量交换

image-20220205123603971


位操作符的使用

先来回顾一下位操作符的作用

位操作符操作的是整形的二进制位,它的操作数是2,比较两个整型的二进制位

  • &按位与:对应的二进制 全为1才是1,否则0
  • |按位或:对应的二进制 有1为1,全为0才为0
  • ^按位异或:相同为0,不同为1

比较一下正常的二进制相加和按位异或,发现按位异或是没有进位的相加

image-20220205124949408

原本应该是010,但是按位异或后是000

1+1需要进位的1并没有进到下一位里去

而使用按位与操作符,我们可以得到这两个数相加需不需要进位

0 0 1
0 0 1
//按位与-全1为1
0 0 1
//<< -左移1位
0 1 0

这时候将按位与之后的结果和按位异或相加,就是我们的答案了

但是题目要求不能使用加减

  • 再将按位与的结果0 1 0与 按位异或结果0 0 0进行按位与
  • 得到0 0 0 ,代表无需进位
  • 这时候将0 1 00 0 0 进行按位异或,即得出相加后的结果0 1 0

这个例子比较简单,我们可以再用复杂一点的例子再证明它的可行性

3:0011和5:0101

操作结果
1:按位与和左移0 0 1 0需要进位
2:按位异或0 1 1 0
3:1和2按位与,左移0 1 0 0需要进位
4:1和2按位异或0 1 0 0
5:3和4按位与,左移1 0 0 0需要进位
6:3和4按位异或0 0 0 0
7:5和6按位与,左移0 0 0 0无需进位
8:5和6按位异或1 0 0 0得到结果为8

根据这个思路,我们成功地完成了3和5的相加


代码实现

本题是接口型题目,我们只需要完成一个函数,实现相加的功能

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param num1 int整型 
 * @param num2 int整型 
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int Add(int num1, int num2) 
{
    while(num2)
    {
        int t = (num1 & num2) << 1;
        num1 ^= num2;
        num2 = t;
    }
    return num1;
}

不过我们可以自己写一个主函数来测试它的可行性

如图,函数正确算出了两个数的和

image-20220205150245074


如果这篇博客帮到了你,还请点个赞啦~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕雪华年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值