我的想法想法比较简单,没有什么优化。
考虑加数和被加数的二进制位,逐位取异或运算,然后用得到的结果与进位取异或。
对于新产生的进位可以考虑加数,被加数和当前进位的值进行判断,如果这三个数中有2个以上为1,则新的进位就是1.否则就是0
编写代码时注意,因为!=和==的优先级比位运算的优先级高,所以位运算要在括号里
代码如下:
#include<stdio.h>
#include<stdlib.h>
void main()
{
int n,m;
int jin = 0x0000;
int weishu = 0x0001;
int he = 0,t;
int n1,m1;
int i;
int tjin;
scanf("%d%d",&n,&m);
while(weishu)
{
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;
//printf("one\n");
}
else
{
if( (n1^m1^jin) == 0 && (n1|m1|jin) != 0)
{
tjin = weishu<<1;
}
}
jin = tjin;
he = he|t;
weishu = weishu<<1;
}
printf("%d\n",he);
system("pause");
}
浙公网安备 33010602011771号