2013-06-07 7 views
2

Я нашел исходный код на языке C. Я беру здесь: link:Добавление двух целых чисел без использования оператора plus

#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

Это зависит от представления целых чисел, являющихся [двоичное дополнение] (HTTP: //en.wikipedia .org/вики/Two% 27s_complement). Это справедливо для большинства современных компьютеров, но стандарт не требуется. – dmckee

ответ

6

Эта «техника» - это мозговой тизер. Что касается практического применение идет, это примерно так же бесполезно, как он получает: все это делает вычисление в two's complement отрицательное b без использования унарного минуса:

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

Добавки заменяется вычитанием здесь: a + b = a - (-b). Поскольку в большинстве современных процессоров (по крайней мере, во всем, о чем я знаю) отрицательные целые числа представлены в виде двух дополнений, -b = ~b + 1 (побитовое NOT, а затем плюс 1). Следовательно, a + b = a - (~b + 1) = a - ~b - 1.

+0

К сожалению, у этого есть один сломанный угловой случай: 'b == INT_MIN'. –

0

Кто-то однажды разработал процессор, который только реализовал инструкцию вычитания, которая была немного более элегантной, чем ссылочный код.

Код

c = a - ~b - 1; 

является немного более сложным способом сказать

c = a - -b; 

и, кроме того, требует 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.

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


Смежные вопросы