我的想法想法比较简单,没有什么优化。
考虑加数和被加数的二进制位,逐位取异或运算,然后用得到的结果与进位取异或。
对于新产生的进位可以考虑加数,被加数和当前进位的值进行判断,如果这三个数中有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"); }