使用位运算完成正整数的加法

Add Integer Using Bit Operation

Posted by ywlvs on August 1, 2018

看 MySQL 中数据结构时,提到了关于 unsigned 型数据做减法可能出现的问题,因此想到了底层的运算原理,找了找相关的文章,大概了解了使用位运算进行加法的实现过程。

不晓得如何使用语言表达,直接举个例子吧。

有两个二进制数,1011 和 1101

1011
1101

1011 ^ 1101 = 0110
1011 & 1101 = 1001

与运算结果之后不为 0,说明需要进位,将与运算的结果左移一位,得到 10010,将异或运算和与运算的结果继续进行同样的操作

00110 ^ 10010 = 10100
00110 & 10010 = 00010

与运算结果依旧不为 0,左移,得到 00100

10100 ^ 00100 = 10000
10100 & 00100 = 00100

与运算结果不为 0,再次左移一位,得到 01000

10000 ^ 01000 = 11000
10000 & 01000 = 00000

与运算结果为 0,结束运算,11000 即为两个数的和


#include <stdio.h>

int my_add(int a, int b)
{
    int s = a;

    while (b) {
        s = a ^ b;
        b = (a & b) << 1;
        a = s;
    }

    return s;
}