2010-08-07 13 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

'-' के साथ क्या गलत है? 'ए + बी' के साथ क्या गलत है? –

+0

यह यादें भी वापस लाता है। हमारे प्रोफेसर हमें उस मामले के लिए लूप, या 'if' कथन का उपयोग नहीं करने देंगे। – 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

यह एक त्रुटि के दौरान होगा (ए और बी) कथन ए और बी बूलियन –

+6

@ सीरगटायल सी में लगभग कुछ भी एक बूलियन नहीं हो सकता है। – Flexo

+1

@ChiragTayal 0 झूठा है और अन्य सभी नंबर सी – REALFREE

1

को ध्यान में रखते कैसे ऋणात्मक संख्याओं प्रतिनिधित्व कर रहे हैं, निम्नलिखित की गणना होगी एक - ख:

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

ओपी के रूप में पहले ही नोट किया गया है :) यह आपके ऐड कार्यान्वयन पर ध्यान देता है, जो निश्चित रूप से गलत है। निम्नलिखित यह (बस के बाद से अन्य बेहतर तरीके पहले से ही दिए गए हैं) करने के लिए एक अजीब तरीका है

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

में सत्य हैं। ओपी को यह मिला। – quantumSoup

+1

शीर्षक "बिना उपयोग किए दो नंबर घटा रहा है" - 'ऑपरेटर "जिसका अर्थ यह नहीं है कि आपके दिखाए गए कोड की तरह ऐड/सब बिटवाई लागू करें, यही वह तरीका है जिसे आपने सोचा था कि यह किया जा सकता है, लेकिन इस बारे में कोई संकेत नहीं है कि शिक्षक ने आपको क्यों पूछा उस। हो सकता है कि वह यह सुनिश्चित करना चाहता है कि आप 2 के पूरक को समझते हैं, और ~ थोड़ा सा ऑपरेटर होने के कारण, पूरे कोड को थोड़ा सा बनाता है - इसलिए इसे भी ध्यान में रखा जाता है। इसके अलावा, यहां इस सरल अंतर्दृष्टि नहीं है, इसलिए उत्तर "अनुपयोगी" नहीं हो सकता है (जैसा कि नीचे बटन कहता है) – ShinTakezou

+0

ऑप्स - वह कोड जो बस छुपाता है! - और यह शीर्षक और कोड के बीच कनेक्शन अस्पष्ट है। यह दिखाता है कि समाधान सही है, बशर्ते कि जोड़ सही ढंग से लागू किया गया हो :) - शीर्षक अधिक होना चाहिए "इसे पकड़ें" – ShinTakezou

2

विधि कार्यान्वयन जोड़ें गलत है। ऐसा करें -> इसका एक जावा तरीका।

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); 





} 



} 
संबंधित मुद्दे