我在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;
}
似乎,代码不使用"+"
或"- -"
操作来添加两个整数。
任何人都能告诉我,这项技术或概念是用什么的?
答案 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
是绝对值负数的值,bitwidth
是int
中的位数。
这实际上导致按位式忽略数字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