当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《不使用+运算符添加两个数字的最佳方法是什么?》经验,为你挑选了5个好方法。

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



1> CMS..:

在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是每个位的进位.

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


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

2> ackb..:
int add(int a, int b) {
   const char *c=0;
   return &(&c[a])[b];
}


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

3> davidfowl..:

不对吗?

int add(int a, int b) 
{
   return -(-a) - (-b);
}


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

4> Charlie Mart..:

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

len(range(x)+range(y))

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



5> Deadcode..:

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;
}

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有