Как добавить два числа без использования ++ или + или другого арифметического оператора - PullRequest
52 голосов
/ 19 июля 2009

Как добавить два числа без использования ++ или + или любого другого арифметического оператора?

Это был вопрос, заданный давным-давно в одном из интервью в кампусе. Во всяком случае, сегодня кто-то задал вопрос, касающийся некоторых битовых манипуляций, и в ответах было упомянуто прекрасное выражение Стэнфордский бит тиддлинг Я провел некоторое время, изучая его, и подумал, что на самом деле может быть ответ на вопрос. Я не знаю, я не мог найти один. Ответ существует?

Ответы [ 20 ]

1 голос
/ 21 сентября 2010
#include<stdio.h>

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;
}
1 голос
/ 30 сентября 2011
## to add or subtract without using '+' and '-' ## 
#include<stdio.h>
#include<conio.h>
#include<process.h>

void main()
{
    int sub,a,b,carry,temp,c,d;

    clrscr();

    printf("enter a and b:");
    scanf("%d%d",&a,&b);

    c=a;
    d=b;
    while(b)
    {
        carry=a&b;
        a=a^b;
        b=carry<<1;
    }
    printf("add(%d,%d):%d\n",c,d,a);

    temp=~d+1;  //take 2's complement of b and add it with a
    sub=c+temp;
    printf("diff(%d,%d):%d\n",c,d,temp);
    getch();
}
1 голос
/ 24 ноября 2009
short int ripple_adder(short int a, short int b)
{
    short int i, c, s, ai, bi;

    c = s = 0;

    for (i=0; i<16; i++)
    {
        ai = a & 1;
        bi = b & 1;

        s |= (((ai ^ bi)^c) << i);
        c = (ai & bi) | (c & (ai ^ bi));

        a >>= 1;
        b >>= 1;
    }
    s |= (c << i);
    return s;
}
0 голосов
/ 08 января 2017

С учетом приведенных выше ответов это можно сделать в виде однострочного кода:

int add(int a, int b) {
    return (b == 0) ? a : add(a ^ b, (a & b) << 1);
}
0 голосов
/ 27 июля 2017

Я думаю, этот код будет полезен для добавления двух чисел без оператора плюс

#include<stdio.h>

int main()

{
    int a, b, c;

    printf("enter two no. : ");
    scanf("%d%d", &a, &b);

    c = (a - ~b - 1);
    printf("%d\n", c);

    return 0;
}
0 голосов
/ 20 июля 2009

Будет работать следующее.

x - (-y)
0 голосов
/ 03 февраля 2015
int add_without_arithmatic(int a, int b)
{
    int sum;
    char *p;
    p = (char *)a;
    sum = (int)&p[b];
    printf("\nSum : %d",sum);
}
0 голосов
/ 02 февраля 2015

Вопрос состоит в том, как добавить два числа, поэтому я не понимаю, почему во всех решениях предлагается добавление двух целых чисел? Что если два числа были числами с плавающей запятой, т.е. 2.3 + 1.8 они также не считаются числами? Либо вопрос должен быть пересмотрен, либо ответы.

Для чисел с плавающей точкой, я полагаю, что числа должны быть разбиты на их компоненты, т.е. 2.3 = 2 + 0.3, затем 0.3 следует преобразовать в целочисленное представление, умножив его на коэффициент экспоненты, т.е. 0.3 = 3 * 10^-1 сделайте то же самое для другого числа, а затем добавьте целочисленный сегмент, используя один из методов сдвига битов, приведенный в качестве решения вышеупомянутых ситуаций обработки для переноса в местоположение единичных цифр, т.е. 2.7 + 3.3 = 6.0 = 2+3+0.7+0.3 = 2 + 3 + 7x10^-1 + 3x10^-1 = 2 + 3 + 10^10^-1 (это может быть обработано как два отдельных дополнения 2+3=5 и затем 5+1=6)

0 голосов
/ 14 января 2014

Это можно сделать рекурсивно:

int add_without_arithm_recursively(int a, int b)
{
    if (b == 0) 
        return a;

    int sum = a ^ b; // add without carrying
    int carry = (a & b) << 1; // carry, but don’t add
    return add_without_arithm_recursively(sum, carry); // recurse
}

или итеративно:

int add_without_arithm_iteratively(int a, int b)
{
    int sum, carry;

    do 
    {
        sum = a ^ b; // add without carrying
        carry = (a & b) << 1; // carry, but don’t add

        a = sum;
        b = carry;
    } while (b != 0);

    return a;
}
0 голосов
/ 17 сентября 2012

Код для реализации сложения, умножения без использования операторов +, *; для прохода вычитания 1 дополняют +1 числа до add функции

#include<stdio.h>

unsigned int add(unsigned int x,unsigned int y)
{
         int carry=0;
    while (y != 0)
    {

        carry = x & y;  
        x = x ^ y; 
        y = carry << 1;
    }
    return x;
}
int multiply(int a,int b)
{
    int res=0;
    int i=0;
    int large= a>b ? a :b ;
    int small= a<b ? a :b ;
    for(i=0;i<small;i++)
    {
           res = add(large,res);                    
    }
    return res;
}
int main()
{
    printf("Sum :: %u,Multiply is :: %d",add(7,15),multiply(111,111));
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...