位运算实现加法(转)

用位运算实现加法也就是计算机用二进制进行运算,32位的CPU只能表示32位内的数,这里先用1位数的加法来进行,在不考虑进位的基础上,如下

1 + 1 = 0
1 + 0 = 1
0 + 1 = 1
0 + 0 = 0

很明显这几个表达式可以用位运算的“^”来代替,如下

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
这样我们就完成了简单的一位数加法,那么要进行二位的加法,这个方法可行不可行呢?肯定是不行的,矛盾就在于,如何去
获取进位?要获取进位我们可以如下思考:

0 + 0 = 0
1 + 0 = 0
0 + 1 = 0
1 + 1 = 1
//换个角度看就是这样
0 & 0 = 不进位
1 & 0 = 不进位
0 & 1 = 不进位
1 & 1 = 进位
正好,在位运算中,我们用“<<”表示向左移动一位,也就是“进位”。那么我们就可以得到如下的表达式

//进位可以用如下表示:
(x&y)<<1
到这里,我们基本上拥有了这样两个表达式

x^y //执行加法
(x&y)<<1 //进位操作
我们来做个2位数的加法,在不考虑进位的情况下

11+01 = 100  // 本来的算法
 
// 用推算的表达式计算
11 ^ 01 = 10
 
(11 & 01) << 1 = 10
 
//到这里 我们用普通的加法去运算这两个数的时候就可以得到 10 + 10 = 100
//但是我们不需要加法,所以要想别的方法,如果让两个数再按刚才的算法计算一次呢
 
10 ^ 10 = 00
 
(10 & 10) << 1 = 100
到这里基本上就得出结论了,其实后面的那个 “00” 已经不用再去计算了,因为第一个表达式就已经算出了结果。

继续推理可以得出三位数的加法只需重复的计算三次得到第一个表达式的值就是计算出来的结果。

 

c代码如下:

int Add(int a,int b)
{
 int jw=a&b;
 int jg=a^b;
 while(jw)
 {
  int t_a=jg;
  int t_b=jw<<1;
  jw=t_a&t_b;
  jg=t_a^t_b;
 }
 return jg;
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/koala_bupt/archive/2009/07/26/4381803.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值