2010-08-07 32 views
5

tôi đã thử với mã sau, nhưng tôi không thể hiểu tại sao nó cho tôi câu trả lời sai. tôi đang tính toán phần bổ sung của 2 và bổ sung thêm một số khác.Trừ hai số mà không sử dụng toán tử '-'

#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() 'là đem lại cho bạn kết quả sai vì' Add()' là sai. Logic trong 'sub()' là tốt. – NullUserException

+0

Có gì sai với '-'? Có gì sai với 'a + b'? –

+0

Điều này cũng mang lại những kỷ niệm. Giáo sư của chúng tôi sẽ không cho phép chúng tôi sử dụng vòng lặp hoặc câu lệnh 'if' cho vấn đề đó. – NullUserException

Trả lời

4

tôi sử dụng một chức năng khác nhau add() theo đề nghị của NullUserException, nó hoạt động bây giờ:

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

Điều này sẽ thông qua một lỗi trong khi (a & b) tuyên bố như a và b không boolean –

+6

@ChiragTayal trong C gần như bất cứ điều gì có thể là một boolean. – Flexo

+1

@ChiragTayal 0 là sai và tất cả các số khác là đúng trong C – REALFREE

1

Xét cách số âm được biểu diễn, sau đây sẽ tính toán một - b:

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

như OP đã lưu ý :) Điều này sẽ chuyển sự chú ý đến việc triển khai thêm của bạn, điều đó tất nhiên là sai. Sau đây là một cách kỳ lạ để làm điều đó (chỉ từ những cách tốt hơn khác đã được trao)

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

(giữ ý tưởng tương tự các mã có thể được thực hiện tốt hơn, chỉ là quá mệt mỏi để làm điều đó tốt hơn)

+1

OP nhận được điều đó. – quantumSoup

+1

tiêu đề là "Trừ hai số không sử dụng toán tử '-' không có nghĩa là thực hiện thêm/phụ bit như mã được hiển thị của bạn, đó chỉ là cách bạn nghĩ rằng nó có thể được thực hiện, nhưng không có đầu mối về lý do giáo viên hỏi bạn cái đó. Có lẽ anh ta muốn chắc chắn rằng bạn hiểu được phần bù của 2, và ~ là một toán tử bitwise, làm cho toàn bộ mã bitwise - vì thế điều này cũng được tính đến. Hơn nữa, ở đây không có cái nhìn sâu sắc đơn giản này, do đó, câu trả lời không thể là "unuseful" (như nút xuống nói) – ShinTakezou

+0

ops - tất cả các mã chỉ ẩn đó! - và nó che khuất kết nối giữa tiêu đề và mã. Điều này cho thấy giải pháp là đúng, miễn là bổ sung được triển khai chính xác :) - tiêu đề phải được nhiều hơn "nắm bắt nó" – ShinTakezou

2

thêm phương pháp triển khai phương thức không chính xác. làm như thế này -> Một cách java này.

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





} 



} 
Các vấn đề liên quan