2

我找到了 C 语言的源代码。我从这里获取:链接:

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

似乎,代码不使用"+"or"- -"操作来添加两个整数。谁能告诉我,这种技术或概念是什么?

4

5 回答 5

6

这个“技巧”是一个脑筋急转弯。就实际使用而言,它几乎是无用的:它所做的只是在不使用一元减号的情况下计算b二进制补码的负数:

-b == (~b + 1)
a+b == a - (-b) == a - (~b + 1) == a - ~b - 1;
于 2013-06-07T16:44:52.427 回答
3

此处的加法替换为减法:a + b = a - (-b). 由于在大多数当前处理器中(至少在我所知道的情况下),负整数表示为二进制补码-b = ~b + 1(按位非,然后加 1)。因此,a + b = a - (~b + 1) = a - ~b - 1

于 2013-06-07T16:46:28.523 回答
1

这一行:

hasil = a - ~b -1;

是魔法。该代码假定有符号整数使用2 的补码表示形式表示,这在当今非常流行。这种表示的一个属性是,如果解释为无符号(作为原始位模式,~运算符如何处理它),负数表示为(1 << bitwidth) - n,其中n是负数的绝对值,并且bitwidth是 中的位数int

这实质上导致了一个事实,即按位 NOT-ing 一个数字k将其转换为- k - 1,所以a - (~b) - 1a - (-b - 1) - 1 = a + b

于 2013-06-07T16:47:30.903 回答
0

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

编码

c = a - ~b - 1;

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

c = a - -b;

而且还需要 2 的补码算法。

于 2013-06-07T16:47:22.740 回答
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;


}

输出:总和 = 16


于 2014-07-02T11:08:55.993 回答