您的位置:首页 > 编程语言 > Java开发

Java编写二进制加法器

2016-12-21 13:37 369 查看
最近在学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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java