用位运算实现加法和减法

  用位运算实现加法和减法

位运算异或可以实现没有进位的加法,比如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;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值