Java编写二进制加法器

最近在学VHDL和verilogHDL。

老师讲到了加法器,我就用Java写了两个程序,一个是普通的逐位加法器,另一个是超前进位加法器。

当然,使用VHDL语言编写是最简单的做法。

1.逐位加法器

package t;
import java.util.Scanner;
/*二进制逐位加法器,输入的加数位数一致 不足使用0补齐,进位输入只能为0或1
 *@author Frank
 *@version 1.1
 */
public class CacuOrig {
    public String caculator(String x,String y,int cin){
	//存入字符数组
	char a[]=x.toCharArray();
	char b[]=y.toCharArray();
	String sum="";
	int s=0;
	int cout=0;
	String sb="";
	//逐位求值
	int r=Math.max(a.length, b.length);
	for(int i=r-1;i>=0;i--){
            //字符转为整型
	    int l1=Integer.parseInt(String.valueOf(a[i]));
	    int m1=Integer.parseInt(String.valueOf(b[i]));
	    //计算公式
	    s=l1^m1^cin;
	    cout=(l1&m1)|(l1&cin)|(m1&cin);
	    sum=sum+s;
	    cin=cout;
	} 
        //求和字符串反转为正常次序
	sb=new StringBuffer(sum).reverse().toString();
			
	return "进位输出:"+cout+""+" "+"求和:"+sb+" "+"结果:"+cout+sb;
    }
    public static void main(String []args){
	System.out.println("请输入加数x 加数y 进位输入cin");
	CacuOrig t=new CacuOrig();
	Scanner sc =new Scanner(System.in);
	try{
	    while(sc.hasNext()){
	        String x=sc.next();
	        String y=sc.next();
       	        int cin=sc.nextInt();
	        System.out.println(t.caculator(x,y, cin));
            }
	}catch(Exception e){
	    System.out.println("输入加数的位数不一致!请重新输入");
	}finally{
	    sc.close();		
	}
    }
}

代码类中已存在测试用的main方法,这种编码方式是一种好的习惯,便于每个类的测试,测试完成后也不需要删除main方法,保留下次仍然可以测试。

注意:记得翻转字符串的顺序,另外这里没有对输入数据做校验,严格的来说,应该使用js进行输入数据的校验工作,这里需要保证输入的加数位数相同,否则会进入异常处理,然后提示错误信息。


2.超前进位加法器

package t;
import java.util.Scanner;
/*二进制超前进位加法器,输入的加数位数一致 不足使用0补齐,进位输入只能为0或1
 *@author Frank
 *@version 1.1
 */
public class CacuPlus {
    public String caculator(String x,String y,int cin){
	//存入字符数组
	char a[]=x.toCharArray();
	char b[]=y.toCharArray();
	String sum="";
	int s=0,p=0,g=0;
	int cout=cin;
	String sb="";
	//逐位求值
	int r=Math.max(a.length, b.length);
	for(int i=r-1;i>=0;i--){
	    //字符转为整型
	    int l1=Integer.parseInt(String.valueOf(a[i]));
            int m1=Integer.parseInt(String.valueOf(b[i]));
	    //计算公式
	    g=l1&m1;
            p=l1^m1;
	    s=p^cout;
	    cout=cin*p+g;
	    cin=cout;
	    sum=sum+s;
		    
	} 
	//求和字符串反转为正常次序
	sb=new StringBuffer(sum).reverse().toString();
			
	return "进位输出:"+cout+""+" "+"求和:"+sb+" "+"结果:"+cout+sb;  
    }
    public static void main(String []args){
	System.out.println("请输入加数x 加数y 进位输入cin");
	CacuPlus t=new CacuPlus();
	Scanner sc =new Scanner(System.in);
	try{
	    while(sc.hasNext()){
	        String x=sc.next();
	        String y=sc.next();
	        int cin=sc.nextInt();
		System.out.println(t.caculator(x,y, cin));
	    }
        }catch(Exception e){
	    System.out.println("输入加数的位数不一致!请重新输入");
	}finally{
	    sc.close();		
	}
    }
}
代码与上面的逐位加法器很相似,唯一不同的是计算公式不同,p表示的是进位传播信号,g表示的是进位生成信号,cout表示的是进位输出,而cin就是进位输入信号,s表示每一位的和,用sum表示每一位的和+起来的结果。


测试结果:


2016.12.21

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值