我和一个朋友来回与脑筋急转弯,我不知道如何解决这个问题.我的假设是,有些按位运算符是可能的,但不确定.
在C中,使用按位运算符:
#include
int add(int x, int y) {
int a, b;
do {
a = x & y;
b = x ^ y;
x = a << 1;
y = b;
} while (a);
return b;
}
int main( void ){
printf( "2 + 3 = %d", add(2,3));
return 0;
}
XOR(x ^ y
)是不带进位的加法. (x & y)
是每一位的结转. (x & y) << 1
是每个位的进位.
循环不断添加进位,直到所有位的进位为零.
int add(int a, int b) { const char *c=0; return &(&c[a])[b]; }
不对吗?
int add(int a, int b) { return -(-a) - (-b); }
定义"最佳".这是一个python版本:
len(range(x)+range(y))
在+
执行列表连接,而不是加法.
CMS的add()函数很漂亮.它不应该被一元否定所玷污(非按位运算,等于使用加法:-y ==(~y)+1).所以这是一个使用相同的按位设计的减法函数:
int sub(int x, int y) { unsigned a, b; do { a = ~x & y; b = x ^ y; x = b; y = a << 1; } while (a); return b; }