用位运算实现加法和减法
位运算异或可以实现没有进位的加法,比如3+4.他们的二进制分别为
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000100
3^4的结果为
00000000 00000000 00000000 00000111
转换为2进制为7.但是,要想实现有进位的加法就需实现进位。例如7和9的二进制分别为
00000000 00000000 00000000 00000111
00000000 00000000 00000000 00001001
7^9的二进制为
00000000 00000000 00000000 00001110
7&9<<1的结果为
00000000 00000000 00000000 00000010
结果不为0,存在进位。把7^9的值存入a, (7&9)<<1的值存入b。a^b的结果为
00000000 00000000 00000000 00001100
(a&b)<<1的结果为
00000000 00000000 00000000 00000100
把a^b的值存入a,把(a&b)<<1的值存入b。a^b的结果为
00000000 00000000 00000000 00001000
(a&b)<<1的结果为
00000000 00000000 00000000 00001000
把a^b的值存入a,把(a&b)<<1的值存入b。a^b的结果为
00000000 00000000 00000000 00000000
(a&b)<<1的结果为
00000000 00000000 00000000 00010000
把a^b的值存入a,把(a&b)<<1的值存入b。a^b的结果为
00000000 00000000 00000000 00010000
(a&b)<<1的结果为
00000000 00000000 00000000 00000000
把a^b的值存入a,把(a&b)<<1的值存入b。b的值为0,进位结束,把a转换为二进制为16,结果正确。
实现代码
#include<stdio.h>
#include<stdlib.h>
int add(int a, int b)
{
int add = 0;
int carry = 0;
do
{
add = a^b;
carry = (a&b) << 1;
a = add;
b = carry;
} while (carry);
return a;
}
int main()
{
int a = 17;
int b = 15;
int c = add(a, b);
printf("%d", c);
system("pause");
return 0;
}
要实现位运算减法,只需要把加法转化为减法,比如a+b可以转换为a+(-b)同时可以转换为,a+(~b+1)。比如-3的二进制为
10000000 00000000 00000000 00000011
-3的补码为
11111111 11111111 11111111 11111101
3的二进制为
00000000 00000000 00000000 00000011
~3+1的二进制为
11111111 11111111 11111111 11111101
~3+1的二进制和-3的补码相同,说明他们相等。所以只需调用刚刚写好的加法程序,便可完成减法操作,代码如下
#include<stdio.h>
#include<stdlib.h>
int add(int a, int b)
{
int add = 0;
int carry = 0;
do
{
add = a^b;
carry = (a&b) << 1;
a = add;
b = carry;
} while (carry);
return a;
}
int subtract(int a, int b)
{
return add(a, add(~b, 1));
}
int main()
{
int a = 17;
int b = 15;
//int c = add(a, b);
int d = subtract(a,b );
printf("%d", d);
system("pause");
return 0;
}