不使用加号运算符添加两个整数

时间:2013-06-07 16:41:17

标签: c add

我在C语言中找到了一个源代码。我从这里开始:link:

#include<stdio.h>
int main()
{
    int a,b,hasil;
    printf("Masukan integer pertama: ");
    scanf("%d",&a);
    printf("Masukan integer kedua: ");
    scanf("%d",&b);
    hasil = a - ~b -1;
    printf("Hasil tambah kedua-dua integer :%d",hasil);
    return 0;
}

似乎,代码不使用"+""- -"操作来添加两个整数。 任何人都能告诉我,这项技术或概念是用什么的?

5 个答案:

答案 0 :(得分:6)

这种“技巧”是一种脑筋急转弯。就实际应用而言,它实际上是无用的:它只是在two's complement中计算负b而不使用一元减号:

-b == (~b + 1)
a+b == a - (-b) == a - (~b + 1) == a - ~b - 1;

答案 1 :(得分:3)

在此处使用减法替换添加:a + b = a - (-b)。因为在大多数当前的处理器中(至少在我所知的所有处理器中),负整数表示为二进制补码-b = ~b + 1(按位NOT然后再加1)。因此,a + b = a - (~b + 1) = a - ~b - 1

答案 2 :(得分:1)

这一行:

hasil = a - ~b -1;

是魔术。该代码假设使用2's complement表示来表示有符号整数,这在当今过于流行。此表示的一个属性是,如果解释为无符号(作为原始位模式,~运算符如何处理它),则负数表示为(1 << bitwidth) - n,其中n是绝对值负数的值,bitwidthint中的位数。

这实际上导致按位式忽略数字k将其转换为- k - 1,因此a - (~b) - 1只是a - (-b - 1) - 1 = a + b

答案 3 :(得分:0)

曾经有人设计过一个只实现减法指令的处理器,它比引用的代码更优雅。

代码

c = a - ~b - 1;

是一种稍微过于复杂的说法

c = a - -b;

此外需要2的补码算法。

答案 4 :(得分:0)

以下是该计划:

#include <stdio.h>

#include <conio.h>


unsigned int f (unsigned int a , unsigned int b);


unsigned int f (unsigned int a , unsigned int b)

{

   return a ?   f ( (a&b) << 1, a ^b) : b;

}


int main()

{


int a = 9;

int b = 7;


int c = f(a,b);

printf("Sum = %d", c);

getch();

return 0;


}

输出:Sum = 16