Chinaunix首页 | 论坛 | 博客
  • 博客访问: 339983
  • 博文数量: 73
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1293
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-07 11:17
个人简介

爱运动,爱看书,爱生活!

文章分类

全部博文(73)

文章存档

2014年(7)

2013年(66)

分类: C/C++

2013-04-01 11:55:32

位运算做加法:分析
00101  5
^
10001  17
=
10100

00101  5
&
10001  17
=
00001
<<1
=
00001

此处调用递归就实现了
10100
^
00010
=
10110 22
有了这些分析之后,就不难写出如下的代码了:
#include
using namespace std;
//做加法
int add1(int a,int b)
{
    if(b==0)
      return a;
      int sum=a ^ b;
      int total=(a & b)<<1;
       return add1(sum,total);
}
int main()
{
    cout<<"请输入两个数:"<
    int dw1;
    int dw2;
    cin>>dw1>>dw2;
   cout<
}
位运算交换数值:分析

令a=1,b=2
二进制:
a=1,b=10
第一步:
a=a^b
01
^
10
=11
第二部
b=a^b
11
^
10
=01
第三步:
a=a^b
11
^
01
=10
此时a=2,b=1
C++实现
#include
using namespace std;


//交换
void exchange(int *a,int *b)
{
    if(*a==*b) return;//当a=b时会发生错误:这时相当于a自己做了三次异或,所以在交换之前要先判断两个数是否相等
    *a=*a^*b;
    *b=*a^*b;
    *a=*a^*b;
}


int main()
{
  cout<<"请输入两个数: "<
   int dw1,dw2;
   cin>>dw1>>dw2;
   cout<<"dw1="<
   exchange(&dw1,&dw2);
    cout<<"dw1="<
}

 

阅读(1663) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~