算法之道----不用加,减, 乘 ,除 计算 a+b的值
在面试笔试中会考到这类题目,要求不用加减乘除运算来计算两数和,其实考的就是位运算。
规则1:
如果1010+0101 = 1111在计算上不产生进位, 则1010^0101 = 1010+0101 = 1111
上面1010和 0101 二进制加法计算的特点是没有进位,所以他们的二进制加法和按位异或运算结果才会相同。但是如果如果是二进制加法运算有进位,则明显以上等价关系就不能成立。
思路:如 20(10100)+25(11001) =45二进制加法运算会产生进位,那我们把他转换成a和b两个数 满足a+b = 20+25 = 45且a和b二进制加法不会产生进位,按照规则1有 20+25 = a + b = a ^ b,明显我们可以找到一个例子 a=32(100000) b=13(001101)满足上述要求。
如何找到a 和 b:
当产生进位的时候,我们可以试着把产生进制的位置找出来, 20(10100)+25(11001) 进行按位与运算
10100&11001 = 10000 可知道在最高位是两个1相与,故在最高位产生进位,10100^11001 = 01101这个结果是不进位的结果,只要我们把不进位的异或运算加上进位时候带来的结果增量加起来,就是我们最终想要的结果10100+11001 = 101101 .
结果为:10100^11001+(10100&11001)<<1 = 01101+10000 <<1
a = 01101
b = 10000 <<1 = 100000--->左移位后的结果即为进位产生的增量
如果a b还不满足上面思路中的要求的话,在继续重复上面的过程,知道找出满足思路中的啊a,b的值。
代码如下:
结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库