只用位运算实现加法
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我的想法想法比较简单,没有什么优化。
考虑加数和被加数的二进制位,逐位取异或运算,然后用得到的结果与进位取异或。
对于新产生的进位可以考虑加数,被加数和当前进位的值进行判断,如果这三个数中有2个以上为1,则新的进位就是1.否则就是0
编写代码时注意,因为!=和==的优先级比位运算的优先级高,所以位运算要在括号里
代码如下:
?
#include<stdio.h>
#include<stdlib.h>
voidmain()
{
intn,m;
intjin = 0x0000;
intweishu = 0x0001;
inthe = 0,t;
intn1,m1;
inti;
inttjin;
scanf("%d%d",&n,&m);
while(weishu)
//printf("one\n");
}
else
{
if( (n1^m1^jin) == 0 && (n1|m1|jin) != 0)
{
tjin = weishu<<1;
}
}
Βιβλιοθήκη Baidujin = tjin;
he = he|t;
weishu = weishu<<1;
}
printf("%d\n",he);
system("pause");
}
{
n1 = n&weishu;
m1 = m&weishu;
t = n1^m1;
t = t^jin;
tjin = 0;
//只要n1,m1,jin中有两个以上1,则进位就是1
//注意因为!=和==的优先级比位运算的优先级高,所以位运算要在括号里
if( (n1&m1&jin)!=0)//三个1
{
tjin = weishu<<1;
考虑加数和被加数的二进制位,逐位取异或运算,然后用得到的结果与进位取异或。
对于新产生的进位可以考虑加数,被加数和当前进位的值进行判断,如果这三个数中有2个以上为1,则新的进位就是1.否则就是0
编写代码时注意,因为!=和==的优先级比位运算的优先级高,所以位运算要在括号里
代码如下:
?
#include<stdio.h>
#include<stdlib.h>
voidmain()
{
intn,m;
intjin = 0x0000;
intweishu = 0x0001;
inthe = 0,t;
intn1,m1;
inti;
inttjin;
scanf("%d%d",&n,&m);
while(weishu)
//printf("one\n");
}
else
{
if( (n1^m1^jin) == 0 && (n1|m1|jin) != 0)
{
tjin = weishu<<1;
}
}
Βιβλιοθήκη Baidujin = tjin;
he = he|t;
weishu = weishu<<1;
}
printf("%d\n",he);
system("pause");
}
{
n1 = n&weishu;
m1 = m&weishu;
t = n1^m1;
t = t^jin;
tjin = 0;
//只要n1,m1,jin中有两个以上1,则进位就是1
//注意因为!=和==的优先级比位运算的优先级高,所以位运算要在括号里
if( (n1&m1&jin)!=0)//三个1
{
tjin = weishu<<1;