題目
思路
核心思想:先處理數字,再統一處理指令
處理數字:把所有的進制轉化爲10進制,把所有要去賦值的的寄存器轉化爲他代表的數字 ;這些數字統稱爲我們要取處理的中介值 ,還是轉化爲10進制最方便,就算我們最後要輸出2進制,大不了用10進制再轉化一下 。
處理指令:主要是對10進制數的低八位和高八位的運算,如何清空低八位,如何清空高八位?
AC代碼
/*
樣例輸入
2
3
MOV AL,2
MOV BH,03H
ADD CL,BL
5
MOV AX,2
MOV BX,038H
MOV CX,11B
ADD AX,CX
ADD DL,CL
樣例輸出
5 3 0 0
5 48 3 3
*///2*3*3種情況
#include <bits/stdc++.h>
//還是轉化爲10進制最方便,就算我們最後要輸出2進制,大不了用10進制再轉化一下
//核心思想:把所有的進制轉化爲10進制,把所有要去賦值的的寄存器轉化爲他代表的數字 ;這些數字統稱爲我們要取處理的中介值
//細節總結來說,就是對低八位和高八位的處理和轉化!
//轉移的話,高八位如何清空?低八位如何清空?
//相加的話,因爲是十進制,低八位隨便加;高八位先保留低八位,在將高八位取出相加後再放回
//其中取出低八位就是取餘,取出高八位就是整除,放回高八位就是運算後加之前保存好的低八位值
using namespace std;
int arr[4];//存放四個通用寄存器數據
int chartoint(char c)
{
if(c>='0'&&c<='9') return c-'0';
else return c-'A'+10;
}
int change(string str,int n)
{
int answer=0;
for(int i=0;i<str.size();i++)
{
answer*=n;
answer+=chartoint(str[i]);
}
return answer;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(arr,0,sizeof(arr));
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
char ord[60];
char buf[60];
scanf("%s%s",ord,buf);
string order=ord;
string value=buf;
int number=0;
if(value[3]>='0'&&value[3]<='9')//對要去賦值的人先進行處理
{
if(value[value.size()-1]=='H')
{
value.erase(value.end()-1,value.end());
number=change(value.substr(3),16);
}
else if(value[value.size()-1]=='B')
{
value.erase(value.end()-1,value.end());
number=change(value.substr(3),2);
}
else
{
number=atoi(value.substr(3).c_str());
}
}
else
{
int from=value[3]-'A';
//注意:題目說的是位數一致,因此可以出現AH,BL的情況,不要耍小聰明,又沒有簡化了運算!那不如老實點!
if(value[4]=='H') number=arr[from]/256;//取出高八位
if(value[4]=='L') number=arr[from]%256;//取出低八位
if(value[4]=='X') number=arr[from];
}
//下面對寄存器指令進行處理
int to=value[0]-'A';
if(order=="MOV")
{
if(value[1]=='H') arr[to]=arr[to]%256+number*256;//清空高八位相當於取出低八位 ,再操作
if(value[1]=='L') arr[to]=(arr[to]/256)*256+number;//通過第一步整除運算,使得低八位全是0了 ,再乘以原高位
if(value[1]=='X') arr[to]=number;
}
else if(order=="ADD")
{
if(value[1]=='H') arr[to]=arr[to]%256+(arr[to]/256+number)*256;//運算高八位,先取出低八位
if(value[1]=='L') arr[to]+=number;
if(value[1]=='X') arr[to]+=number;
}
}
printf("%d %d %d %d\n",arr[0],arr[1],arr[2],arr[3]);
}
return 0;
}