`
kevin_wanwei
  • 浏览: 114543 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java代码模拟计算机实现原理(一)加法器模拟

 
阅读更多

加法器是有两种基本逻辑门电路:异或门、与门电路组成的

 

 

加法是最基本的算术运算。所以,如果想要建造一台计算机(这是本书隐含讨论的问题),
必须首先知道如何构造一种机器,它可以把两个数加起来。当你解决了这个问题,你会发现
加法正是计算机唯一所做的事情,因为通过使用用于加法的机器,我们还可以构造用加法来
实现减法、乘法、除法以及计算房产抵押款、引导向火星发射卫星、下棋和电话计费等等功
能的机器。
同现代的计算器和计算机比起来,本章构造的加法机庞大、笨重、速度慢且噪声大。但
有意思的是构成它的部件完全是前几章学过的电子设备,如开关、灯泡、电线、电池以及可
构成几种逻辑门的继电器。这个加法机包含的所有部件都于1 2 0年以前就已发明,而且,我们
并不用真正地在屋子里建造它,只需在纸上和脑子里构造这台机器就行了。
这个加法机只能工作于二进制数,而且它缺少很多现代计算机(器)的辅助设备。它不
能用键盘来敲入你想加的数,代之的你只能用一系列开关表示待加的数。它也不能用显示器
显示结果,你所看到的只是一排灯泡。
但这台加法机确实实现了两数相加的功能,而且其工作方式和计算机做加法十分相似。
二进制加法与十进制加法很像。当你相加十进制数如2 4 5和6 7 3时,你把问题分解成简单
的步骤,每一步只对一对十进制数字相加。本例中,第1步是把5和3加起来。生活中,你若能
记住加法表,问题的解决就快多了。
十进制加法和二进制加法的一大区别是二进制数字的加法表要比十进制数字的加法表简
单得多:
+ 0 1
0 0 1
1 1 1 0

你可能在学校里记过上面这张表,并背诵过如下口诀:
0加0等于0,
0加1等于1,
1加0等于1,
1加1等于0,进1。
把相加结果的数前加上零,可以把加法表改写成如下形式:
+ 0 1
0 0 0 0 1
1 0 1 1 0
这样一来,二进制数字相加的结果是两位数,分别称为“和”和“进位”(比如“ 1加1等
于0,进位是1”)。现在,可以把这张二进制加法表分成两张表,第1张是表示“和”的表:
+和0 1
0 0 1
1 1 0
第2张是表示“进位”的表:
+进位0 1
0 0 0
1 0 1
以这种方式来看待二进制加法就很方便了,因为加法机会分开求和与进位。构造二进制
加法机需要设计一个能执行表中所描述操作的电路。因为电路的所有部件,如开关、灯泡、
电线都是可以表示成二进制数的,因而该电路由于仅工作于二进制数从而大大降低了电路的
复杂性。
与十进制加法一样,二进制加法也从最右边的一列开始,逐列相加两个数:
注意,当从右边加到第3列的时候,产生了一个进位。同样的情况也发生在第6、7、8列。
我们要加多大的数呢?由于这个加法机只是在脑子里构造,因而可以加很长的数字。为
更合理一些,选择不超过8位的二进制数。也就是说,操作数的范围是从0 0 0 0 - 0 0 0 0~1111 -
1111,即十进制的0~2 5 5。两个8位二进制数的和最大可以是1 - 1111 - 111 0,即5 1 0。

 

当你看到下面两个1位二进制数相加的进位表时,你可能立刻会想到逻辑门和二进制加法
之间有某种联系:
+进位0 1
0 0 0
1 0 1
你也许已意识到这和上章所述的与门的输出是一样的:
A N D 0 1
0 0 0
1 0 1
所以,与门可以用来计算两个1位进制数位相加得到的进位。
看来我们已取得一点儿进展了,下一步就要看看有没有继电器能完成下面的工作:
+和0 1
0 0 1
1 1 0
这是二进制加法运算中的另一半问题,虽说表示和的这一位不如进位那么容易实现,但
我们会有办法。
首先应意识到或门的输出和我们所期望的很近似,只是右下角的结果不同:
O R 0 1
0 0 1
1 1 1
而对于与非门而言,除了左上角的输出不同以外,其他结果也与期望的一样:
N A N D 0 1
0 1 1
1 1 0

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logic;

/**
 *
 * @author Administrator
 */
public abstract class LogicGates {
    /**
     * 逻辑与门电路
     * @param a
     * @param b
     * @return 
     */
    public static byte AND(byte a,byte b){
        if(a==1 && b==1){
            return 1;
        }
        return 0;
    }
    /**
     * 逻辑或门电路
     * @param a
     * @param b
     * @return 
     */
    public static byte OR(byte a,byte b){
        if(a==1 || b==1){
            return 1;
        }
        return 0;
    }
        /**
     * 逻辑或门电路
     * @param a
     * @param b
     * @return 
     */
    public static byte XOR(byte a,byte b){
        if(a==b){
            return 0;
        }
        return 1;
    }
    /**
     * 逻辑非门
     * @param b
     * @return 
     */
    public static byte NOT(byte b){
        if(b==1){
            return 0;
        }
        return 1;
    }
    
        /**
     * 逻辑与非门
     * @param b
     * @return 
     */
    public static byte NAND(byte a,byte b){
        if(b==1 && a==1){
            return 0;
        }
        return 1;
    }
     /**
     * 逻辑缓冲器
     * @param b
     * @return 
     */
    public static byte BUFFER(byte b){
        return b;
    }
    
    
     /**
     * 逻辑或非门
     * @param b
     * @return 
     */
    public static byte NOR(byte a,byte b){
        if(b==0 && a==0){
            return 1;
        }
        return 0;
    }
    

    
    public static void main(String[] args){
        byte a=1;
     byte b=   LogicGates.AND((byte)1, (byte)0);
    }
}

 

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logic;

/**
 *
 * @author Administrator
 */
public abstract class Utils {
    
        
    /**
     * 
     * 只可以是0和1
     * @param a
     * @param b 
     */
    public static void validate(byte a,byte b){
        if((a!=0 && a!=1)|| (b!=0 && b!=1)){
           throw new RuntimeException("非法参数"); 
        }
    }
    
   
    
        /**
     * 
     * 只可以是0和1
     * @param a
     * @param b 
     */
    public static void validate(byte b){
        if( b!=0 && b!=1){
           throw new RuntimeException("非法参数"); 
        }
    }
    /**
     * 打印
     */
    public static void print(byte[] b){
        for(int i=0;i<b.length;i++){
            System.out.print(b[i]);
        }
        System.out.println();
    }
}

 

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logic;

/**
 *
 * @author Administrator
 */
public abstract class Adder {
    /**
     * 半加器 
     * @return 
     */
    public static byte[] HalfAdder(byte a,byte b){
        Utils.validate(a,b);
        return new byte[]{LogicGates.AND(a, b),LogicGates.XOR(a, b)};
    }
    /**
     * 全加器
     * @return 
     */
    public static byte[] FullAdder(byte a,byte b,byte ci){
        Utils.validate(a,b);
        Utils.validate(ci);
        byte fs=LogicGates.XOR(a, b);
        byte sco=LogicGates.AND(fs, ci);
        return new byte[]{LogicGates.OR(sco, LogicGates.AND(a, b)),LogicGates.XOR(fs, ci)};
    }
    /**
     * 八位全加器
     * @param a
     * @param b
     * @return 
     */
    public static byte[] EightAdder(byte[] a,byte[] b){
        if(a==null || a.length!=8){
             throw new RuntimeException("非法参数"); 
        }
        if(b==null || b.length!=8){
            throw new RuntimeException("非法参数"); 
        }
        byte[] resu=new byte[8];
        byte[] temp=null;
        byte ci=0;
        for(int i=7;i>=0;i--){
            Utils.validate(a[i],b[i]);
            temp=FullAdder(a[i],b[i],ci);
            ci=temp[0];
            resu[i]=temp[1];
        }
        return resu;
    }
    
    
    
    public static void main(String [] args ){
       Utils.print( Adder.EightAdder(new byte[]{0,0,0,0,1,1,0,1}, new byte[]{0,0,0,0,1,0,0,1}));
    }
}

 

2
1
分享到:
评论

相关推荐

    Java实战项目:计算器应用程序 - 实现基本的数学运算功能

    当创建一个计算器应用程序时,我们需要考虑如何实现基本的数学运算功能,包括加法、减法、乘法和除法。在这篇Java实战博客中,我将向您展示如何使用Java编程语言创建一个简单的计算器应用程序。我们将从创建用户界面...

    计算机系统结构实验

    计算机系统结构实验1到3,加法器流水线模拟,静态加法乘法流水线模拟,动态加法乘法流水线模拟,java编写

    SynthPi:Java中的开源虚拟模拟,加法器官和Karplus-Strong合成器引擎

    #SynthPi Java中的开源虚拟模拟,加法器官和Karplus-Strong合成器引擎。 所有文档和用户手册都可以在这里找到: : 。 SynthPi使用并感谢以下开源组件和资源: JAudioLibs(由Neil C.Smith提供)包括Audio Ops ...

    java范例开发大全源代码

     实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12 ...

    图灵机Java程序源码

    本资源给出了Eclipse下图灵机的完整Java程序源码工程包,开发说明文档中给出了图灵机概要设计,功能实现程序结构剖析,明了易懂,源码导入Eclipse即可使用,无需编译,实用性极强。 功能简述:Java GUI(AWT)生成...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    (5) implements 子句用于说明类中将实现哪些接口,接口是 Java 的一种引用类 型。 (6) 类体包含了变量和方法。在类体中定义的数据、变量和方法称为类的成员, 或称为实例变量和实例方法。 (7) 例如: 下例定义...

    java范例开发大全

    实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 ...

    Java范例开发大全 (源程序)

     实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12  实例5...

    Java范例开发大全(全书源程序)

    实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 关系运算符 13 实例7 逻辑...

    java范例开发大全(pdf&源码)

    实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 ...

    vc代码合集

    2012-06-11 10:26 51,200 VHDL_六位加法器.doc 2012-06-11 10:39 3,519,250 WINTCV191双语版免费C语言编译器.zip 2012-06-11 10:15 212,946 《先进pid控制matlab仿真》光盘源码.rar 2012-06-11 09:48 199 【Visual ...

    JetBrains-Academy-Java

    咖啡机一个简单的终端应用程序,可模拟咖啡机。 您可以订购热饮料,检查并填充存储的食材,然后收款。井字游戏与AI 终端的井字游戏应用程序。 它使您可以与其他人或计算机对战。 还可以观看计算机与自己的游戏。 该...

    mockmvc-filter-registration

    模拟mvc过滤器注册这是一个测试项目,旨在强调正常的Spring Boot应用程序启动与使用@AutoConfigureMockMvc注释的测试之间在过滤器注册方面的差异。 设置大致如下: 有一个自动配置SampleFilterAutoConfiguration ,...

Global site tag (gtag.js) - Google Analytics