双符号位法:
将符号位扩展为2位,具体说就是对于正数两个符号位是“00”,对于负数两个符号位是“11”。
两个符号位都看作数码一样参加运算。
两个数相加后,其结果的符号位出现“01”或“10”两种组合时,表示发生溢出。
Ø符号位“01”,上溢出
Ø符号位“10”,下溢出
Ø符号位“00”或者“11”,未溢出
从[y]补求[-y]补的法则是:
对[y]补“包括符号位求反且最末位加1”,即可得到[-y]补
定点乘法运算:
在定点计算机中,两个原码表示的数相乘的运算规则是:
乘积的符号位由两数的符号位按异或运算得到,而乘积的数值部分则是两个正数相乘之积。
设n位被乘数和乘数用定点小数表示(定点整数也同样适用)
被乘数 [x]原=xf.xn-1…x1x0
乘数 [y]原=yf.yn-1…y1y0
则乘积
[z]原=(xf⊕yf)+(0.xn-1…x1x0)(0.yn-1…y1y0)
式中,xf为被乘数符号,yf为乘数符号。
机器算法:
机器中一种方法是多次采用”加法-移位“的方法来完成,称为串行乘法器,它的硬件结构简单,但是速度慢,目前广泛使用的是流水式阵列乘法器,称为并行乘法器。
无符号数m乘以n会产生m*n个位积,出现m+n个列和,并行乘法器的关键是快速产生m*n个位积,对位积进行相加运算产生m+n个列和。
第一步:
位积的产生
观察乘法运算:
0*0=0,0*1=0,1*0=0,1*1=1
相当于:
a∩b
所以m*n个位积可以由m*n个与门并行产生。
第二步:
列和的产生:
利用全加器
浮点数的加减法运算:
浮点数的加减法运算分为六个步骤:
(1)0操作数检查
浮点加减运算过程比定点运算过程复杂。
如果判知两个操作数x或y中有一个数为0,即可得知运算结果而没有必要再进行后续的一系列操作以节省运算时间。
0操作数检查步骤则用来完成这一功能。
参加加法运算的数据都是非零,进入下一步。
(2)比较价码大小并完成对阶
为了便于直观理解,假设两数均以补码表示,阶码采用双符号位,尾数采用单符号位。
两浮点数进行加减,首先要看两数的阶码是否相同,若二数阶码不同,表示小数点位置没有对齐,此时必须使二数阶码相同,这个过程叫作对阶。
对阶操作规定使尾数右移,尾数右移后阶码作相应增加,因此对阶时,总是使小阶向大阶看齐。
(3)尾数进行加减运算
对阶结束后,即可进行尾数的求和运算。
不论加法运算还是减法运算,都按加法进行操作(减法利用补码减法转换成补码的加法来做),其方法与定点加减法运算完全一样。
(4)结果规格化
a.采用双符号位表示尾数时,如果两符号位为01或10时,应将结果尾数右移一位,阶码加1(叫“右规”)。
b.如果尾数最高数值位与符号位相同,应将尾数左移,阶码减1,直至数值位最高位与符号位相反(叫“左规”)。
(5)舍入运算
在对阶向右规格化,尾数向右移位,这样被右移的尾数的低位部分会被丢掉,从而造成一定误差,要进行舍入处理。
简单的舍入方法有两种:
一种是“0舍1入”法,即如果右移时被丢掉数位的最高位为0则舍去,为1则将尾数的末位做加加1运算。
另一种是“恒置1”法,即只要数位被移掉,就在尾数的末尾恒置1。
(6)判断结果是否溢出
阶码为00011,阶码的符号位为00,根据补码的双符号检测溢出的方法确定阶码不溢出。
登陆窗口流程图
逻辑运算流程图
定点整数单符号位补码加减法流程图
定点整数的原码乘法窗体流程图
附件
主体窗口代码如下:
packagegyj;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.JOptionPane;
publicclassMainFrameextendsFrameimplementsActionListener
{
staticinti=0;
staticintm=1;
Labela1,a2,a22;
TextFieldtext1;
Buttonbutton1,m1,m2,m3,m4;Fontf;
MainFrame(Strings)
{
super(s);
setLayout(null);
f=newFont("楷体",Font.BOLD,20);
m1=newButton("逻辑运算");
m2=newButton("定点整数单符号位补码加减");
m3=newButton("定点整数原码一位乘法");
m4=newButton("浮点加减法");
m1.addActionListener(this);
m2.addActionListener(this);
m3.addActionListener(this);
m4.addActionListener(this);
m1.setBounds(10,30,120,25);
m2.setBounds(140,30,150,25);
m3.setBounds(300,30,120,25);
m4.setBounds(430,30,80,25);
add(m1);add(m2);add(m3);add(m4);
a1=newLabel("计算机组成原理算法实现(三)",Label.CENTER);
a2=newLabel("输入口令(学号):
");
a22=newLabel("密码正确,请选择上面菜单进行操作",Label.CENTER);
a1.setBounds(150,100,300,40);
a1.setBackground(Color.WHITE);
a1.setFont(f);
a2.setBounds(150,200,90,25);
a2.setBackground(Color.white);
a22.setBounds(200,200,200,25);
a22.setForeground(Color.white);
a22.setBackground(Color.blue);
a22.setVisible(false);
text1=newTextField(18);
text1.setEchoChar('●');
text1.setBounds(240,200,200,25);
button1=newButton("确认");
button1.setBounds(270,250,70,30);
button1.addActionListener(this);
add(a1);add(a2);add(a22);add(text1);add(button1);
setBackground(Color.white);
setBounds(100,100,610,400);
setVisible(true);
validate();
addWindowListener(newWindowAdapter()
{publicvoidwindowClosing(WindowEvente)
{System.exit(0);}
});
}
publicstaticvoidmain(Stringargs[])
{
MainFramegyj=newMainFrame("计算机组成原理");
}
publicvoidactionPerformed(ActionEvente)
{
Strings=newString("2");
if(e.getSource()==button1)
{
while(i==0&&m<=3&&(!
(text1.getText().equals(""))))
{
if(text1.getText().equals(s))
{
i=1;
JOptionPane.showMessageDialog(this,"口令正确,请选择菜单栏的操作",
"正确",JOptionPane.INFORMATION_MESSAGE);
text1.setEnabled(false);
text1.setVisible(false);
a22.setVisible(true);
a2.setVisible(false);
}
else{
m++;
JOptionPane.showMessageDialog(this,"您输入的口令不正确",
"警告",JOptionPane.WARNING_MESSAGE);
text1.setText(null);
}
}
if(m>3)
{
JOptionPane.showMessageDialog(this,"您三次口令错误,已被禁用",
"警告",JOptionPane.ERROR_MESSAGE);
}
}
if(i==1)
{
if(e.getSource()==m1)
{
luojiyunsuans1=newluojiyunsuan("逻辑运算");
s1.setVisible(true);
}
elseif(e.getSource()==m2)
{
zhengshujiajianf1=newzhengshujiajian();
f1.setTitle("定点整数单符号位补码加减");
f1.setVisible(true);
}
elseif(e.getSource()==m3)
{
zhengshuchengfaf2=newzhengshuchengfa();
f2.setTitle("定点整数原码一位乘法");
f2.setVisible(true);
}
elseif(e.getSource()==m4)
{
fudianyunsuanf5=newfudianyunsuan("浮点加减法");
f5.setVisible(true);
}
}
}
}
逻辑运算代码如下:
packagegyj;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.JOptionPane;
publicclassluojiyunsuanextendsFrameimplementsActionListener
{
intme=0;
Labelb1,b2,b3,b4;Fontf;
TextFieldt1,t2,t3;
Buttonbutton1,button2,button3,button4,button5,button6;
luojiyunsuan(Strings)
{
super(s);setLayout(null);
f=newFont("楷体",Font.BOLD,20);
b1=newLabel("逻辑运算",Label.CENTER);
b2=newLabel("请输入第一个数:
");
b3=newLabel("请输入第二个数:
");
b4=newLabel("结果");
b1.setBounds(180,100,250,40);
b1.setFont(f);
b1.setBackground(Color.white);
b2.setBounds(100,200,120,25);
b3.setBounds(100,250,120,25);
b2.setBackground(Color.white);
b3.setBackground(Color.white);
b4.setBounds(100,300,120,25);
t1=newTextField(15);
t2=newTextField(15);
t3=newTextField(15);
t1.setBounds(250,200,200,25);
t2.setBounds(250,250,200,25);
t3.setBounds(250,300,200,25);
button1=newButton("输入");button2=newButton("逻辑非");
button3=newButton("逻辑加");button4=newButton("逻辑乘");
button5=newButton("逻辑异");button6=newButton("返回");
button1.setBounds(80,350,70,25);button2.setBounds(160,350,70,25);
button3.setBounds(240,350,70,25);button4.setBounds(320,350,70,25);
button5.setBounds(400,350,70,25);button6.setBounds(480,350,70,25);
setBounds(100,100,600,400);
setBackground(Color.white);
add(b1);add(b2);add(b3);add(b4);add(t1);add(t2);add(t3);
add(button1);add(button2);add(button3);add(button4);
add(button5);add(button6);
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);
button4.addActionListener(this);
button5.addActionListener(this);
button6.addActionListener(this);
validate();
addWindowListener(newWindowAdapter()
{publicvoidwindowClosing(WindowEvente)
{setVisible(false);}
});
}
publicvoidactionPerformed(ActionEvente)
{
if(e.getSource()==button1)
{me=1;
t1.requestFocusInWindow();
}
elseif(me==1)
{
if(e.getSource()==button2)
{
b4.setText("逻辑非:
");
Stringsg=t1.getText();
intindex=sg.indexOf("+");
intl=sg.length();
StringBuffers=newStringBuffer(sg);
for(inti=0;i{
if(s.charAt(i)=='0')
s.setCharAt(i,'1');
else
s.setCharAt(i,'0');
}
Stringss=s.substring(index+1);
t3.setText(ss);
}
elseif(e.getSource()==button3)
{
b4.setText("逻辑加:
");
Stringsg=t1.getText();
Stringsg2=t2.getText();
if(sg.length()!
=sg2.length())
{
JOptionPane.showMessageDialog(this,"您输入的两个参数长度不一样",
"警告对话框",JOptionPane.WARNING_MESSAGE);
}
else{
intindex=sg.indexOf("+");
//Stringss=sg.substring(index+1);
StringBuffers=newStringBuffer(sg);
StringBuffers2=newStringBuffer(sg2);
for(inti=0;i{
if(s.charAt(i)=='1'||s2.charAt(i)=='1')
s.setCharAt(i,'1');
else
s.setCharAt(i,'0');
}
Stringss=s.substring(index+1);
t3.setText(ss);
}
}
elseif(e.getSource()==button4)
{
b4.setText("逻辑乘:
");
Stringsg=t1.getText();
Stringsg2=t2.getText();
if(sg.length()!
=sg2.length())
{
JOptionPane.showMessageDialog(this,"您输入的两个参数长度不一样",
"警告对话框",JOptionPane.WARNING_MESSAGE);
}
else{
intindex=sg.indexOf("+");
//Stringss=sg.substring(index+1);
StringBuffers=newStringBuffer(sg);
StringBuffers2=newStringBuffer(sg2);
for(inti=0;i{
if(s.charAt(i)=='1'&&s2.charAt(i)=='1')
s.setCharAt(i,'1');
else
s.setCharAt(i,'0');
}
Stringss=s.substring(