`
kevin_wanwei
  • 浏览: 117565 次
  • 性别: 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代码模拟CPU

    在本文中,我们将深入探讨如何使用Java编程语言来模拟一个CPU。这个项目旨在设计和实现一个基本的、功能完备的最小化汇编语言级CPU模拟器,它能够处理基本指令,进行I/O操作,如与控制台、打印机、磁盘交互,并具备...

    计算机组成原理算法实现 (二)

    在学习这些内容时,不仅需要理解理论,还要通过实践来熟悉各种运算过程,这可以通过编写模拟程序或使用专门的计算机组成原理教学软件来实现。"zuchengyuanli_1"这个文件可能包含了相关的练习题或代码示例,帮助...

    eda八位加法的java实现

    在这个特定的场景中,我们讨论的是使用Java语言来模拟实现一个八位加法器的逻辑功能。 在传统的硬件设计中,加法器是一种基本的数字逻辑组件,它能够执行两个二进制数的加法操作。八位加法器是基于两个四位加法器...

    用java模拟windows计算器

    总的来说,模拟Windows计算器是一个很好的练习,它涵盖了基础的Java GUI编程和事件处理,同时也涉及到一些逻辑思维和问题解决技巧。这个项目不仅可以提高你的编程技能,还能让你对Java Swing应用有更直观的认识。

    java编写的计数器模拟程序

    该Java程序通过简洁的代码实现了基础的计算器功能,并利用了Swing组件库提供的强大功能构建了一个直观易用的图形界面。通过对不同按钮事件的监听及合理的逻辑处理,确保了用户可以方便地进行数学计算。此外,程序还...

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

    在这个Java实战项目中,我们将构建一个简单的计算器应用程序,利用Java Swing库来创建用户界面,并实现基本的数学运算功能。以下是一些关键知识点: 1. **Java Swing库**:Java Swing是Java Foundation Classes ...

    JAVA FC模拟器源代码

    1. **CPU模拟**:在源代码中,你会看到一个类用于表示CPU,这个类包含了6502指令集的每个指令的实现。这些指令通常包括加法、减法、跳转、比较、加载寄存器等操作。理解每个指令的工作原理及其在内存中的映射至关...

    计算机组成原理 习题解答 任国林

    计算机组成原理是理解计算机系统运作基础的关键领域,它涉及到计算机硬件和软件的交互。本题解答涉及了多个核心概念。 首先,实际机器是指物理存在的、能够执行指令的计算机硬件系统,而虚拟机器则是指在软件层面上...

    2015计算机组成原理实验一1

    【计算机组成原理实验一1】主要涉及的是运算器的基本组成和使用,以及如何在Logisim软件平台上构建和测试运算器。实验目的是让学生熟悉Logisim软件,掌握运算器的工作原理,包括溢出检测、有符号和无符号数的运算...

    java二进制运算器(加、见、乘、除)

    在这个Java二进制运算器中,我们将深入探讨这些基本操作以及如何在代码中实现它们。 1. **二进制数系统**: 二进制是计算机科学中的基础,只有两个数字0和1。所有的计算都在这个系统下进行,因为计算机内部处理的是...

    计原课程设计实现CPU(java程序+文档).zip

    在Java程序中,这可以通过一个循环结构实现,每次迭代模拟一次时钟周期。 7. **文档部分**:项目中提供的文档可能包含设计报告、源代码注释和使用指南,帮助用户理解代码结构和功能,以及如何运行和测试这个CPU模型...

    计算器模拟程序java

    本项目是一个基于Java的简单计算器模拟程序。该程序旨在通过图形用户界面(GUI)实现整数的基本四则运算(加、减、乘、除)。根据描述,程序应该能够提供一个直观且易于使用的界面,使用户可以方便地进行计算。 ###...

    EDA八位乘法的java实现

    总之,通过这个实验,学生不仅掌握了软件工具的使用,还深入理解了数字逻辑和硬件设计的基础知识,以及如何用高级语言如Java模拟这些逻辑。这种跨领域的学习对于计算机科学与技术专业的学生来说是非常宝贵的。

    使用java实现caculator

    在本项目中,我们主要探讨如何使用Java编程语言来实现一个计算器应用,即"使用Java实现caculator"。这个项目涵盖了整个工程的构建过程,包括主类的设计以及具体功能的实现。下面我们将深入讨论相关知识点。 1. **...

    计算机组成原理 习题解答

    虚拟机器则是在软件层面上模拟的计算机,例如Java虚拟机,它提供了一个抽象的平台,使得程序可以在不同的硬件环境中运行。 2. 机器指令与指令格式:机器指令是计算机硬件可以直接执行的最基本命令,其格式通常包括...

    计算机组成原理课后习题答案

    计算机组成原理是计算机科学的基础课程,它探讨了计算机硬件系统的各个组成部分及其相互作用。本章节主要涉及计算机的基本概念和设计思想,以及数据表示和运算。 1. 计算机分为模拟计算机和数字计算机。模拟计算机...

    Java实现简单计算器

    Java实现的简单计算器是一个基础的编程项目,它可以帮助初学者理解面向对象编程的概念以及Java语言的基本语法。在这个项目中,我们将探讨以下几个关键知识点: 1. **基本语法与数据类型**:Java是一种静态类型的...

    2016年计算机一级考试模拟试题及答案.doc

    2016年计算机一级考试模拟试题及答案 本资源提供了2016年计算机一级考试的模拟试题及答案,涵盖了计算机一级考试的主要知识点,包括高级程序设计语言、操作系统、微机配置、计算机病毒、网络传输介质、电子计算机...

    [编译原理] 非递归下降语法分析文档_java模拟

    本文将详细介绍如何使用Java语言来实现一种特定类型的非递归下降语法分析器——基于给定文法的分析器。 #### 二、文法定义 给定的文法定义如下: 1. **E → TE'** 2. **E' → +TE' | ε** 3. **T → FT'** 4. **T...

Global site tag (gtag.js) - Google Analytics