2010-08-07 5 views
5

, я попытался использовать следующий код, но я не понимаю, почему он дает мне неправильный ответ. Я вычисляю дополнение 2 и добавляю с другим номером.Вычитая два числа без использования оператора «-»

#include <stdio.h> 

int add(int a, int b) { 
    while (a) { 
     a = (a & b) << 1; 
     b = a^b; 
    } 
    return b; 
} 

int sub(int a, int b) // add a with b's 2's complement. 
{ 
    return (add(a, add(~b, 1))); 
} 

int main() { 
    int a, b, res; 
    a = 3, b = 1; 
    res = sub(a, b); 
    printf("%d\n", res); 
    return 0; 
} 
+4

'югу()' дает вам неправильный результат, потому что 'добавить()' неправильно. Логика в 'sub()' отлично. – NullUserException

+0

Что не так с '-'? Что случилось с 'a + b'? –

+0

Это также возвращает воспоминания. Наш профессор не позволял нам использовать петли или заявления «если» в этом отношении. – NullUserException

ответ

4

я использовал функцию другого дополнения(), как было предложено NullUserException, он работает сейчас:

int add(int a,int b) 
{ 
    int x; 
    x = a^b; 

    while(a&b) 
    { 
    b = ((a&b)<<1); 
    a = x; 
    x = a^b; 
    //b=(a^b); 
    } 

    return x; 
} 
+0

Это будет ошибка при выполнении while (a & b), так как a и b не являются boolean –

+6

@ChiragTayal в C почти все может быть логическим. – Flexo

+1

@ChiragTayal 0 является ложным, а все остальные числа истинны в C – REALFREE

1

Учитывая то, как представляются отрицательные числа, следующие будут вычислять - B:

int a, b, c; 
// assign to a and b 
c = a + (~b + 1); //() not needed, just to show the point 

как OP уже отметил :) Это обращает внимание на вашу добавленную реализацию, это, конечно, неправильно. Ниже нечетный способ сделать это (просто, так как другие более эффективные способы уже даны)

int add1(int a, int b, int *c) 
{ 
    int r = *c & 1; 
    a &= 1; b &= 1; 
    *c = a&b | a&r | b&r; 
    return a^b^r; 
} 
int inv(int a) 
{ 
    int i, r = 0; 
    for(i = 0; i < sizeof(int)*8; i++) 
    { 
    r = r<<1 | (a&1); 
    a >>= 1; 
    } 
    return r<<1; 
} 
int add(int a, int b) 
{ 
    int r = 0, i; 
    int c = 0; 
    for(i=0; i < sizeof(int)*8; i++) 
    { 
    r |= add1(a>>i, b>>i, &c); 
    r <<= 1; 
    } 
    return inv(r); 
} 

int sub(int a, int b) 
{ 
    return add(a, add(~b, 1)); 
} 

(сохраняя ту же идею, код может быть сделана лучше, просто слишком устали, чтобы сделать его тоньше)

+1

OP получил это. – quantumSoup

+1

заголовок, являющийся «вычитание двух чисел без использования» - «оператор», что не означает, что реализация add/sub побито так же, как и ваш отображаемый код, это так, как вы думали, что это можно сделать, но нет никакой информации о том, почему учитель спросил вас что. Может быть, он хочет быть уверенным, что вы поняли дополнение 2, и ~ будучи побитовым оператором, делает весь код поразрядным - так это тоже учитывается. Более того, здесь нет такого простого понимания, поэтому ответ не может быть «непонятным» (как говорит кнопка «вниз») – ShinTakezou

+0

ops - весь этот код просто скрывает это! - и неясно связь между заголовком и кодом. Это показывает правильность решения, при условии, что добавление выполняется правильно :) - заголовки должны быть более «поймать», – ShinTakezou

2

неверная реализация метода добавления. сделайте это -> Java способ этого.

public int add(int a, int b){ 
    do { 
    a = a & b; //carry 
    b = a^b; //addition 
    a = a << 1; //carry shift to one bit left 
    }while(a != 0); //exit 
    return b;  //addition result 
} 

    public int sub(int a, int b){ 
    return add(a, add(~b, 1)); 

    } 
-3
import java.util.List; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.HashMap; 
import java.util.Hashtable; 
import java.util.LinkedList; 
import java.util.Scanner; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import javax.xml.soap.Node; 

public class mainone { 





public static void main(String args[]){ 


int a=12; 
int b=4; 
Integer c=new Integer(b); 
String d=Integer.toString(c); 
String e="-"; 
String f=e.concat(d); 
Integer g=Integer.parseInt(f); 
System.out.println(a+g); 





} 



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