看 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;
}