Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.
Example: Given a = 1 and b = 2, return 3.
题目大意:
不使用+和-操作符计算两int和
思路:
位操作模拟2进制运算
实现:
// 实现 a
// 从最右边的位开始一位一位地相加进位
int getSum(int a, int b) {
int r = 0;
unsigned int t = a|b;
for(int i = 1;t;i<<=1){
r|=(i&(a^b)&r)<<1; //r的第i位为1且a^b的第i位为1时进位
r^=(i&(a^b)); //计算r的第i位
r|=(i&a&b)<<1; //a&b的第i位为1时进位
t>>=1;
}
return r;
}
// 实现 b
// 不断左移异或保留为1的位直到没有位需要进位
// 相比上一种方法,这里是多位同时进位
int getSum(int a, int b) {
int r = b;
for(;a;b=r){
r^=a;
a=(a&b)<<1;
}
return r;
}
// 实现 c
// 原理同上一种方法,写成递归形式
int getSum(int a, int b) {
return a?getSum((a&b)<<1,b^a):b;
}
方法 b 解释:
3+7和123+234的计算过程
// 使用这个程序手动输入a,b以获取更多例子
// 输出每次循环后的r,a,b的二进制
#include <stdio.h>
void pbit(int x,int k){if (k) pbit(x>>1,k-1),printf("%d", x & 1);}
int getSum(int a, int b) {
int t = 1;
int r = b;
for (; a; ){
r ^= a;
a = (a&b) << 1;
b = r;
printf("loop %d:\n", t++);
printf("r: "); pbit(r, sizeof(int) * 8); puts("");
printf("a: "); pbit(a, sizeof(int) * 8); puts("");
printf("b: "); pbit(a, sizeof(int) * 8); puts("");
}
return r;
}
int main(void){
for (;;){
int a, b;
scanf("%d%d", &a, &b);
printf("sum:%d\n", getSum(a, b));
}
return 0;
}