博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法学习(6)----不用 + - × ÷ 做加法运算
阅读量:6619 次
发布时间:2019-06-25

本文共 1020 字,大约阅读时间需要 3 分钟。

  今天网上看到一个神算法,惊异不已,遂摘录于下:

原文地址:

第一步不考虑进位,对每一位相加。0加0 1加1的结果都0,0加1与1加0的结果都是1。我们可以注意到,这和异或的结果是一样的。对异或而言,0和0、1和1异或的结果是0,而0和1、1和0的异或结果是1。接着考虑第二步进位,对0加0、0加1、1加0而言,都不会产生进位,只有1加1时,会向前产生一个进位。此时我们可以想象成是两个数先做位与运算,然后再向左移动一位。只有两个数都是1的时候,位与得到的结果是1,其余都是0。第三步把前两个步骤的结果相加。如果我们定义一个函数AddWithoutArithmetic,第三步就相当于输入前两步骤的结果来递归调用自己。

有了这些分析之后,就不难写出如下的代码了:

int AddWithoutArithmetic(int num1, int num2)

{

        if(num2 == 0)

                return num1;

 

        int sum = num1 ^ num2;

        int carry = (num1 & num2) << 1;

 

        return AddWithoutArithmetic(sum, carry);

}

后面网友给出了另外一种巧妙方法,利用地址偏移实现加法,代码如下:

int add(int a,int b){

    char * c;
    c = (char *) a;
    return &c[b];
}

 

着实令我感叹的是第二个算法,解析如下:

  对于一个数组 int arrInt[], arrInt[i]等同于 *(arrInt+i); 因为一个 int 型变量占用4个字节,所以 arrInt+i 在数值上等同于 arrInt+4*i;因此,为了达到实际想要的 arrInt+i 的效果,可以使用 char 型数组 char arrChar[], 这样 arrChar[i] 就等同于 *(arrChar+i) ,而且 arrChar+i 就是 arrChar+i。

  这个巧妙算法正是利用了这种思想,先把 int 型的 a 强制转换为 char 型指针 c, 那么 c[b] 就等同于 *(c+b) ,也就是*(a+b),然后用取地址运算符 & 去掉 * 的作用,所以 &c[b] 就等同于 (c+b),也就是 a+b 了。

转载于:https://www.cnblogs.com/dongling/p/5767444.html

你可能感兴趣的文章
AsyncHttpSupport并发发送请求
查看>>
一名女程序员对iOS的想法
查看>>
Cloud Native未来值得关注的方向:Service Mesh简介
查看>>
西班牙现新型电费退款网络诈骗 侨胞需谨防上当
查看>>
JVM新生代和老年代配置原则
查看>>
昆明滇池水质达30年来最好 百名“市民河长”守卫“母亲河”
查看>>
太合音乐发布“少年红星音乐计划” 力促00后创作浪潮
查看>>
ICO后STO也被明令禁止,区块链并不是法外之地
查看>>
浅尝辄止,React是如何工作的
查看>>
ECS vs Kubernetes:相似但是不同
查看>>
6000多套iOS源码大分享
查看>>
一个完整Java Web项目背后的密码
查看>>
前端笔试题面试题记录(上)| 掘金技术征文
查看>>
移动端页面分享快照生成总结
查看>>
收发数据的原理(上)
查看>>
AccessibilityService 从入门到出轨
查看>>
七层网络协议-tcp/ip协议
查看>>
React 学习资源
查看>>
Jenkins插件开发入门指南
查看>>
XSS姿势——文件上传XSS
查看>>