ZOJ1072 Microprocessor Simulation

简介:
   这道题我觉得加法这里比较难懂,和分成高字和低字,分别存放在寄存器A和B中。

复制代码
#include <iostream>
using namespace std;

const int MAXSIZE = 256;//内存最多有个字
const int WORDWIDTH = 4;//每个字位
int memory[MAXSIZE];//内存

//9种指令
typedef enum 
{
    LD ,
    ST ,
    SWP ,
    ADD ,
    INC ,
    DEC , 
    BZ , 
    BR ,
    STP 
};

int main(void)
{
    char ch;
    int i;
    while (true)
    {
        //输入数据
        memset(memory,0,MAXSIZE);//初始化内存
        ch = getchar();
        while((ch < '0' || ch > '9') && (ch < 'A' || ch > 'F'))
            cin>>ch;
        
        if(ch == '8')
            break;
        //输入内存数据
        for (i=1;i<MAXSIZE;++i)
        {
            cin>>ch;
            if (ch>='0'&&ch<='9')
            {
                memory[i] = ch-'0';
            }
            else if (ch>='A'&&ch<='F')
            {
                memory[i] = ch-'A'+10;
            }
        }
        int curOpt,accumA=0,accumB=0,high,low,pos,sum,pc=0;
        bool bFinished = false;
        while (!bFinished)
        {
            curOpt = memory[pc++];//当前指令
            switch(curOpt)
            {
            case LD:
                {//加载数据到寄存器A
                    high = memory[pc++];//高字位
                    low = memory[pc++];//低字位
                    pos = (high<<WORDWIDTH)+low;//实际位置
                    accumA = memory[pos];
                }
                break;
            case ST:
                {//将寄存器A中数据存到内存
                    high = memory[pc++];//高字位
                    low = memory[pc++];//低字位
                    pos = (high<<WORDWIDTH)+low;//实际位置
                    memory[pos] = accumA;
                }
                break;
            case SWP:
                {//交换两个数(这种方式避免内存溢出)
                    accumA = accumA^accumB;
                    accumB = accumA^accumB;
                    accumA = accumA^accumB; 
                }
                break;
            case ADD:
                {//寄存器A和寄存器B中数据相加,低字放在A中,高字放在B中
                    sum     =   (accumA + accumB) % 0x100;
                    accumA   =   sum & 0x0f;
                    accumB   =   (sum & 0xf0) >> WORDWIDTH;
                }
                break;
            case INC:
                {//寄存器A中数据自增
                    
                    if (++accumA==16)
                    {
                        accumA = 0;
                    }
                }
                break;
            case DEC:
                {//寄存器A中数据自减
                    if (accumA==0)
                    {
                        accumA = 15;
                    }
                    else
                        --accumA;
                }
                break;
            case BZ:
                {//寄存器A中数据等于则跳转
                    high    =   memory[pc++];
                    low     =   memory[pc++];
                    pos     =   (high << WORDWIDTH) + low;
                    if(accumA == 0)
                        pc = pos;//程序计数器指向指定跳转位置
                }
                break;
            case BR://pc自增
                pc = memory[pc+1];//指向下一个位置
                break;
            case STP://停止执行
                bFinished = true;
                break;
            }
        }
        //显示最终内存快照
        for (i=0;i<MAXSIZE;++i)
        {
            if (memory[i]<10)
            {
                cout<<memory[i];
            }
            else
            {
                ch = memory[i]-10+'A';
                cout<<ch;
            }    
        }
        cout<<endl;
    }
    return 0;
}




本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/10/27/1320702.html,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
算法
uva 11549 CALCULATOR CONUNDRUM
题目链接 刘汝佳算法竞赛经典入门训练指南p42
19 0
|
9月前
|
机器学习/深度学习 算法 调度
模拟退火(Simulated Annealing)
模拟退火(Simulated Annealing)是一种元启发式优化算法,灵感来自固体退火的物理过程。它用于在复杂的搜索空间中寻找全局最优解或接近最优解的近似解。模拟退火算法通过在搜索过程中接受一定概率的劣解,以避免陷入局部最优解,并逐渐减小概率,使搜索逐渐趋向于全局最优解。
114 3
|
9月前
UVa1584 - Circular Sequence
UVa1584 - Circular Sequence
23 0
|
9月前
UVa11549 - Calculator Conundrum (Floyd判圈法)
UVa11549 - Calculator Conundrum (Floyd判圈法)
31 0
|
人工智能
Kuroni and Impossible Calculation——容斥原理-鸽笼原理-抽屉原理
题目描述 已知一个数组a[n],请计算式子:∏_{1≤i<j≤n}|ai−aj| 的值,其中1<=i,j<=n;我们可以认为,这一式子等价于 |a1−a2|⋅|a1−a3|⋅ … ⋅|a1−an|⋅|a2−a3|⋅|a2−a4|⋅ … ⋅|a2−an|⋅ … ⋅|an−1−an|
93 0
Kuroni and Impossible Calculation——容斥原理-鸽笼原理-抽屉原理
HDU-1012,u Calculate e
HDU-1012,u Calculate e
|
C++
蓝桥杯 - C++ calculation
蓝桥杯 - C++ calculation
132 0
|
算法
HDOJ 1202 The calculation of GPA
HDOJ 1202 The calculation of GPA
75 0