学习了位运算后总想着怎么把它用在程序中,奈何知识量有限,在这里便写一个位运算实现两数之和的功能》
首先我们得先链接位运算的三个基本操作符:
& | 按位与—(有0为0,双1位1 ) |
---|---|
I | 按位或—(有1为1,双0为0) |
^ | 按位异或—(不同为1,相同为0) |
接下来我们想要用位运算解决两数之和,得先知道他们的二进制形式。
例如:2+3=5
2 | 0010 |
---|---|
3 | 0011 |
5 | 0101 |
不难看出第二位发生了进位,那么我们怎么用符号实现呢:
(2 & 3)<<1 | (0010 & 0011)<<1 = 0100 |
---|---|
2^3 | 0010 ^0011 = 0001 |
5 | 0100^0001 = 0101 |
虽然上述看似成立了,但是云算起来仍然有问题,这里仅仅考虑到了单次进位,假设有多次进位那么这个等式便不成立。
而很自然的想到连续进位那么就会联想到循环,下面这个代码便用了循环实现多次进位:
#include <stdio.h>
int main()
{
int x, y;
scanf_s("%d %d", &x, &y);
while (x & y)//一但x&y为真就代表,存在要进位
{
int m = x,n = y;
x = m^n;
y=(m & n)<<1;
}
printf("%d + %d = %d\n", x, y, x ^ y);
return 0;
}
上述代码中的while的条件很好的让所有的进位都能进行。