不使用+运算符添加两个数字的最佳方法是什么?

use*_*126 25 addition low-level

我和一个朋友来回与脑筋急转弯,我不知道如何解决这个问题.我的假设是,有些按位运算符是可能的,但不确定.

CMS*_*CMS 42

在C中,使用按位运算符:

#include<stdio.h>

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;
}
Run Code Online (Sandbox Code Playgroud)

XOR(x ^ y)是不带进位的加法. (x & y)是每一位的结转. (x & y) << 1是每个位的进位.

循环不断添加进位,直到所有位的进位为零.

  • 左移一个负值是未定义的行为,它会在许多处理器上按预期工作,但不能保证,你应该在你的答案中指出这一点.另外,你可以在你的printf语句中添加\n吗?除此之外,很好的答案. (4认同)

ack*_*ckb 23

int add(int a, int b) {
   const char *c=0;
   return &(&c[a])[b];
}
Run Code Online (Sandbox Code Playgroud)

  • @ffledgling`c`的地址最初是0.c [a]`的地址是`0 + a = a`.并且`(&c [a])[b]`的地址是`a + b`.很好的作弊,虽然仍然是`add`被隐含使用. (5认同)
  • +1好作弊...滥用指针和数组算术做加法... (2认同)
  • 我不太明白这个是怎么工作的,解释会很棒! (2认同)
  • 请注意,您需要分配足够大的数组以获取最大的和。否则,创建超出数组范围的指针是“未定义的行为”。 (2认同)

dav*_*owl 9

不对吗?

int add(int a, int b) 
{
   return -(-a) - (-b);
}
Run Code Online (Sandbox Code Playgroud)

  • 在问题评论中,@ pomeranian.myopenid.com提到不能使用算术运算符.此外,最好使用减法作为 - ( - b)作为替代操作. (5认同)

Cha*_*tin 5

定义"最佳".这是一个python版本:

len(range(x)+range(y))
Run Code Online (Sandbox Code Playgroud)

+执行列表连接,而不是加法.


Dea*_*ode 5

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;
}
Run Code Online (Sandbox Code Playgroud)