1

我正在尝试制作一个二进制计算器,它减去两个二进制数(仅以 2 为基数)而不解析它。

任何人都可以帮助我解决上数字为零和下数字为一的情况,我似乎无法为其编写代码。

for (int i = ss.length()-1; i > -1; i--)
        {
            if(s.charAt(i)=='0' && ss.charAt(i)=='0') sb.append("0");
            else if (s.charAt(i)=='1' && ss.charAt(i)=='0') sb.append("1");
            else if (s.charAt(i)=='1' && ss.charAt(i)=='1') sb.append("0");
            else
            {
                sb.append("1");
                doit(s,i+1,sb);
            }
        }

        for (int i = s.length() - ss.length(); i >-1; i--) 
        {
            sb.append(s.charAt(i));
        }

        ArrayList<Character> res = new ArrayList<>();
        for (int i =  sb.length()-1; i > -1; i--)
        {
            res.add(sb.charAt(i));
        }
        System.out.println(res);
    }
    public static void doit(StringBuilder s, int i, StringBuilder sb)
    {
        for (int j = i; j > -1; j--)
        {
            if(s.charAt(j)=='0')
            {
                s.setCharAt(j, '1');
            }
            else
            {
                s.setCharAt(j, '0');
                break;
            }
        }
    }
4

3 回答 3

2

二进制减法规则。

1 - 1 = 0
0 - 0 = 0
1 - 0 = 1
0 - 1 = 1 (needs a carry bit from a higher bit position.  
    You might have to check several higher bits before you 
    find the carry bit.  -1 otherwise.)
于 2012-11-14T18:40:31.063 回答
0

你可以严格按位,从右到左,至少像一些芯片一样。棘手的知识是一个五列表:(a,b,来自先前位置的进位位)->(结果,新进位位)。您实际上并没有从更高级别的职位上借钱;你将underverflow带入那些。请参见此处的表 2.4:

http://books.google.com.ua/books?id=vpWS-s4d5vMC&pg=PA25&lpg=PA25&dq=binary+subtraction+table+carry&source=bl&ots=458JWgZl8v&sig=sjuXedv96KCbNWmxQAPNQo7iuRw&hl=en&sa=X&ei=i-6jUI7IB8jusgay8IDABQDQ#vQDQ= onepage&q=二进制%20减法%20table%20进位减法&f=false

定义两种方法:(a,b, 先前位置的进位位) -> 结果和 (a,b, 先前位置的进位位) -> 新的进位位,并将它们从右到左应用。


替代方案:根据此处的规则反转您的第二个参数:http: //simple.wikipedia.org/wiki/Negative_binary_numbers

然后将 #1 添加到倒置的 #2 :)。

PS。谁说这是一个糟糕的任务:)?

于 2012-11-14T19:26:14.477 回答
-1
import java.util.Scanner;
class binary_diff
{
    public String diff(String st1,String st2)
    {
        String nst="",max="";char b='0';boolean tf=(st1.length()>=st2.length());
        int l1=st1.length(),l2=st2.length();
        if(l1<l2)
        for(int a=1;a<=l2-l1;a++)
        st1='0'+st1;

        else if(l2<l1)
        for(int a=1;a<=l1-l2;a++)
        st2="0"+st2;
        if(!tf)for(int a=l1-1;a>=0;a--)
        if(st1.charAt(a)!=st2.charAt(a))
        if(st2.charAt(a)=='1'){max=st2;st2=st1;st1=max;break;}

        for(int a=st1.length()-1;a>=0;a--)
        {
            if(st1.charAt(a)=='1' && st2.charAt(a)=='0')
            {
                if(b=='1')
                {nst='0'+nst;b='0';}
                else
                nst='1'+nst;
            }

            else if(st1.charAt(a)==st2.charAt(a) && st2.charAt(a)=='1')
            {
                if(b=='1')
               {nst='1'+nst;b='1';}
                else
                nst='0'+nst;
            }

            else if(st1.charAt(a)=='0' && st2.charAt(a)=='1')
            {
                if(b=='1')
                nst='0'+nst;
                else
                {nst='1'+nst;b='1';}
            }

            else
            {
                if(b=='1')
                nst='1'+nst;
                else
                nst='0'+nst;
            }
        }
        return nst;
    }

    public static void main()
    {
        Scanner sc=new Scanner(System.in);
        System.out.println("Enter the two numbers");
        String s1=sc.next();
        String s2=sc.next();
        binary_diff bd=new binary_diff();
    System.out.println(bd.diff(s1,s2));
    }
}
于 2017-05-19T12:06:40.340 回答