【牛客网】JZ65:不用四则运算符实现两数相加
[TOC]
问题来源
牛客网数据结构题目👉JZ65
题目要求如图
思考
不能使用四则运算,根据过往的学习经历,我唯一能想到的就是位操作符和移位操作符
例:使用位操作符进行int变量交换
位操作符的使用
先来回顾一下位操作符的作用
位操作符操作的是整形的二进制位,它的操作数是2,比较两个整型的二进制位
- &按位与:对应的二进制 全为1才是1,否则0
- |按位或:对应的二进制 有1为1,全为0才为0
- ^按位异或:相同为0,不同为1
比较一下正常的二进制相加和按位异或,发现按位异或是没有进位的相加
原本应该是010,但是按位异或后是000
1+1需要进位的1并没有进到下一位里去
而使用按位与
操作符,我们可以得到这两个数相加需不需要进位
1 | 0 0 1 |
这时候将按位与之后的结果和按位异或相加,就是我们的答案了
但是题目要求不能使用加减
- 再将按位与的结果
0 1 0
与 按位异或结果0 0 0
进行按位与 - 得到
0 0 0
,代表无需进位 - 这时候将
0 1 0
与0 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的相加
代码实现
本题是接口型
题目,我们只需要完成一个函数,实现相加的功能
1 | /** |
不过我们可以自己写一个主函数来测试它的可行性
如图,函数正确算出了两个数的和
如果这篇博客帮到了你,还请点个赞啦~
- 本文标题:【牛客网】JZ65:不用四则运算符实现两数相加
- 创建时间:2022-02-05 15:21:28
- 本文链接:posts/1481999994/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!