2021年10月22日 计组+数据结构

1. 原码和补码除法中的加减交替法的区别

2. 强制类型转换

2.1 定点数的强制类型转换

2.2 浮点数的强制类型转换

xx位机器:CPU当中的寄存器一次能够处理的数据的比特位位数

3. 边界对齐 

4. 浮点数的表示

 

5. 浮点数的规格化

 5.1 浮点数的左规和右规

 5.2 浮点数的溢出

 6. IEEE 754标准

Institute of Electrical and Electronics Engineers

 

 

7. 浮点数的表示和运算

7.1 浮点数的加减运算

7.2 浮点数的加减运算舍入 

8. 算数逻辑单元 

 8.1 逻辑符号

 

8.1.1 门的电路实现

8.2 加法设计器

8.2.1 一位全加器 

8.2.2 串行加法器

8.2.3 并行加法器

本质上和穿行加法器没啥区别,因为一直要等上一位的进位信息

 并行加法器的优化

通过增加额外的线路连接提高速度

 在CLA加法器的基础上继续拓展成CLA电路

 

ALU芯片的组织

 组内并行,组间串行或者并行

 

9. 存储系统

9.1 主存储器

9.1.1 存储体

9.1.2 存储器芯片的结构

读写控制线可以是一根,也可以是两根

地址线和数据线与存储芯片的容量等价

片选线有两种模式,根据送来的0/1信号确定是否工作

 

9.2 寻址

按不同大小的单元来切分存储器的存储体

 

10.  数组模拟环形队列

10.1 代码实现

package com.yan.DataStructures.Queue;

import java.util.Scanner;

public class CycleArrayQueueDemo {
    public static void main(String[] args) {
//        测试
        System.out.println("数组模拟环形队列");

//        为了和单项数组模拟的队列作对比,这里是4来存放3个数据,因为空了一个位置
        CycleArray queue = new CycleArray(4);
//        接收用户输入
        char key = ' ';
//        创建Scanner对象
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
//        输出一个菜单
        while(loop)
        {
            System.out.println("s(show):显示队列");
            System.out.println("e(exit):退出程序");
            System.out.println("a(add):添加数据到队列");
            System.out.println("g(get):从队列取出数据");
            System.out.println("h(head):查看队列头的数据");

//            接收用户输入的字符
            key = scanner.next().charAt(0);

            switch (key)
            {
                case 's':
                    queue.showQueue();
                    break;
                case 'a':
                    System.out.println("请输入想添加的数");
                    int value = scanner.nextInt();
                    queue.addQueue(value);
                    break;
                case 'g':
                    try {
                        int res = queue.getQueue();
                        System.out.printf("取出的数据是%d\n", res);
                    }
                    catch (Exception e)
                    {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h':
                    int res = queue.headQueue();
                    System.out.printf("队列的头数据是%d\n", res);
                    break;
                case 'e':
//                    关闭scanner
                    scanner.close();
                    loop = false;
                    break;
                default:
                    break;
            }
        }

        System.out.println("程序已退出!");

    }

}

class CycleArray
{
    //    数组最大容量、队列头、队列尾,用于存放数据的数组
    private int maxSize;
    //    队列头指向第一个元素位置
    private int front;
    //    队列尾指向最后一个元素之后的元素位置
    private int rear;
    private int[] arr;

    //    创建队列的构造器
    public CycleArray(int arrMaxSize)
    {
        this.maxSize = arrMaxSize;
        arr = new int[this.maxSize];
    }

    //    判断队列是否满
    public boolean isFull()
    {
        return (rear+1) % maxSize == front;
    }

    //    判断队列是否为空
    public boolean isEmpty()
    {
        return rear == front;
    }

    //    1.添加数据到队列
    public void addQueue(int k)
    {
//        先判断队列是否满
        if(isFull())
        {
            System.out.println("队列已满!");
            return;
        }

        arr[rear] = k;
//        此处后移rear的时候考虑取模
        rear = (rear+1) % maxSize;
    }

    //    2.数据出队
    public int getQueue()
    {
        if(isEmpty())
        {
//            通过抛出异常来处理
            throw new RuntimeException("队列为空,不能取数据!");
        }

        int tmp = arr[front];
        front = (front+1) % maxSize;
        return tmp;
    }

    //    3.显示队列的所有数据
    public void showQueue()
    {
        if(isEmpty())
        {
            System.out.println("队列为空,没有数据!");
            return;
        }

//        这里需要重点理解,这个for循环的开始到终止条件怎么写,以及打印的时候为什么还要对i取模
        for (int i = front; i < front+((rear+arr.length-front) % maxSize); i++) {
            System.out.printf("arr[%d]=%d\n", i%maxSize, arr[i%maxSize]);
        }
    }

    //    4.显示队列的头数据(不是取数据)
    public int headQueue()
    {
        if(isEmpty())
        {
            System.out.println("队列为空,没有头数据!");
            return 0;
        }

        return arr[front];
    }

}

总结

 

1. 谈谈在数据存储中边界对齐和非边界对齐的区别?

  如果使用边界对齐的方法,就是用内存换时间,如果使用非边界对齐的方法,就是用时间换内存,例如要读一个半字的short变量,如果是边界对齐则只需要读一次地址(计算机每次访存只能读写1个字!),如果采用非边界对齐的话有可能访存两次,虽然降低了内存空间的占用,但是增大了时间成本

2. 单精度浮点数和双精度浮点数的最大和最小值分别是多少?

 

3. 谈谈机械码和真值的区别?

  机械码没有正负号,而真值有,计算机硬件层面使用的是机械码,而人更理解的是真值

4. int和float都是4字节,它们之间相互进行强制转换会有什么结果?

  从表示范围上来说,float的表示范围大于int,但是都是4字节32位,能表示的总个数都是2^32个,因此int强转成float的时候,虽然不会产生溢出(因为int的表示范围小于float),但是可能会损失精度。float强转成int的时候,既可能发生溢出,也有可能损失精度

5. 谈谈如何使用基础电路实现异或门?

 

6. 如何优化加法计算器的速度?

通过不断添加电路线,组成新的模块,使得既能在组内并行,又能组间并行运算

7. 实现数组模拟环形队列的注意点

注意要预留一个空位,这样做的目的是方便判断这个数组模拟循环队列时候的空和满。

在打印队列元素的时候,注意怎么写

for(int i=front; i<(front+(rear+arr.length-front)%maxSize); i++)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值