双符号位法:
将符号位扩展为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)判断结果是否溢出
根据补码的双符号检测溢出的方法确定阶码是否溢出。
3主要技术指标及特点
针对题目的各个功能要求,本人将程序分为一个主模块ZuCheng和六个子模块分别为Password、Show、Form3、Form4、Form5、Help。
显然这是一个典型的使用模块化结构的程序。
所有独立功能的部分都采用子模块结构,因为模块化设计使人一目了然。
下面将介绍主模块和各子模块的运用特点和参数说明,并给出他们的流程图和主要Java代码。
3.1登录窗体
口令输入错误时给出重新输入口令的提示
三次口令输入错误被禁止使用
Password模块流程图
Password模块的主要Java代码
publicvoidactionPerformed(ActionEvente)
{
Strings=newString("123"
if(e.getSource()==button1)
{
while(i==0&&m<=3&&(!
(text1.getText().equals(""))))
{
if(text1.getText().equals(s))
{
i=1;
}
else
{
m++;
JOptionPane.showMessageDialog(this,"您输入的密码不正确","警告对话框",JOptionPane.WARNING_MESSAGE);text1.setText(null);}
}
if(m>3)
{
JOptionPane.showMessageDialog(this,"您已被禁用","错误对话框",JOptionPane.ERROR_MESSAGE);}
}
if(e.getSource()==button2)
{
setVisible(false);
}
if(i==1)
{
ZuChengs1=newZuCheng("操作菜单");
s1.setVisible(true);
setVisible(false);
}
}
3.2操作界面
通过ZuCheng主模块,调用Show、Form3、Form4、Form5、Help子模块。
当选择对应子模块的按钮就可以调用各个子模块,而各子模块之间是相互独立的,下面用模块图来表示
程序模块间的调用关系:
(箭头起始处模块调用箭头指向处模块)
Zucheng模块流程图
Zucheng模块的主要Java代码
publicvoidactionPerformed(ActionEvente)
{
if(e.getSource()==m1)
{
Shows1=newShow("机器数表示");
s1.setVisible(true);
}
elseif(e.getSource()==m2)
{
Form3f1=newForm3();
f1.setTitle("定点变形补码加减");
f1.setVisible(true);
}
elseif(e.getSource()==m3)
{
Form4f2=newForm4();f2.setTitle("定点原码乘法");f2.setVisible(true);
}
elseif(e.getSource()==m4)
{
Form5f5=newForm5("浮点加减");
f5.setVisible(true);
}
elseif(e.getSource()==m5)
{
Helph1=newHelp("帮助信息");
h1.setVisible(true);
h1.work();
}
}
3.3定点小数机器表示窗口界面
在上面的窗体中按“输入”按扭时,将输入焦点设置为最上面的一个文本框上。
输入一个带符号的二进制定点小数(如+0.11010或-0.010101)后,按“原码”、“反码”、“补码”或“移码”按扭中的任一个后,将在第二个文本框中显示对应的机器数,同时要求将第二个标签中“原码”字样改成对应的编码字样。
选择“返回”按扭时回到主窗体。
比如,用户输入-0.010101,执行相应的操作会出现相应的结果,如下列各图表示
原码表示:
反码表示:
补码表示:
移码表示:
Show模块流程图
Show模块的主要Java代码
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==button1){
me=1;
t1.requestFocusInWindow();
}elseif(me==1){
if(e.getSource()==button2){
b3.setText("该数对应的原码为:
");
Stringsg=t1.getText();
if(sg.startsWith("+")){
intindex=sg.indexOf("+");
Stringss=sg.substring(index+1);
t2.setText(ss);
}else{
intindex=sg.indexOf("-");
Stringss=sg.substring(index+1);
Stringsf=ss.replaceFirst("0","1");
t2.setText(sf);
}
}elseif(e.getSource()==button3){
b3.setText("该数对应的反码为:
");
Stringsg=t1.getText();
if(sg.startsWith("+")){
intindex=sg.indexOf("+");
Stringss=sg.substring(index+1);
t2.setText(ss);
}else{
intindex=sg.indexOf("-");
Stringss=sg.substring(index+1);
chara[]=ss.toCharArray();
for(inti=2;icharm='1',n='0';
if(a[i]==m){
a[i]=n;
}else{
a[i]=m;
}
}Stringse=newString(a);
Stringsf=se.replaceFirst("0","1");
t2.setText(sf);
}
}elseif(e.getSource()==button4){
b3.setText("该数对应的补码为:
");
Stringsg=t1.getText();
if(sg.startsWith("+")){
intindex=sg.indexOf("+");
Stringss=sg.substring(index+1);
t2.setText(ss);
}else{
intindex=sg.indexOf("-");
Stringss=sg.substring(index+1);
chara[]=ss.toCharArray();
for(inti=2;icharm='1',n='0';
if(a[i]==m){
a[i]=n;
}else{
a[i]=m;
}
}
if(a[a.length-1]=='0'){
a[a.length-1]='1';
}else{
for(intj=a.length-1;j>=2;j--){
if(a[j-1]=='0'){
a[j-1]='1';
a[j]='0';
break;
}else{
a[j]='0';
}
}
}Stringse=newString(a);
Stringsf=se.replaceFirst("0","1");
t2.setText(sf);
}
}elseif(e.getSource()==button5){
b3.setText("该数对应的移码为:
");
Stringsg=t1.getText();
if(sg.startsWith("+")){
intindex=sg.indexOf("+");
Stringss=sg.substring(index+1);
Stringse=ss.replaceFirst("0","1");
t2.setText(se);
}else{
intindex=sg.indexOf("-");
Stringss=sg.substring(index+1);
chara[]=ss.toCharArray();
for(inti=2;icharm='1',n='0';
if(a[i]==m){
a[i]=n;
}else{
a[i]=m;
}
}if(a[a.length-1]=='0'){
a[a.length-1]='1';
}else{
for(intj=a.length-1;j>=2;j--){
if(a[j-1]=='0'){
a[j-1]='1';
a[j]='0';
break;
}else{a[j]='0';
}
}
}Stringsf=newString(a);
t2.setText(sf);
}
}
}if(e.getSource()==button6){
setVisible(false);
}
}
3.4定点小数变形补码加减运算界面
在此窗口用户需要输入两个定点小数来参加运算,同上面一样,用户必需点击输入按钮,才能激活输入框。
输入完毕,用户点击各个按钮,则会出现相应的结果,比如,用户输入-0.11010和+0.01101,执行相应的操作会出现相应的结果,如下图表示
Form3模块流程图
Form3模块的主要Java代码
//获得第一个数的补码
publicStringwork1(){
Stringsg=d1.getText();
sdf");
if(sg.startsWith("+")){
intindex=sg.indexOf("+");
Stringss=sg.substring(index+1);
ss1=ss.replaceFirst("0","00");
}else{
intindex=sg.indexOf("-");
Stringss=sg.substring(index+1);
chara[]=ss.toCharArray();
for(inti=2;icharm='1',n='0';
if(a[i]==m){
a[i]=n;
}else{
a[i]=m;
}
}
if(a[a.length-1]=='0'){
a[a.length-1]='1';
}else{
for(intj=a.length-1;j>=2;j--){
if(a[j-1]=='0'){
a[j-1]='1';
a[j]='0';
break;
}else{
a[j]='0';
}
}
}
Stringse=newString(a);
ss1=se.replaceFirst("0","11");
}
returnss1;
}
//做加法时获得第二个数的补码
publicStringwork2(){
Stringsa=d2.getText();
if(sa.startsWith("+")){
intindex=sa.indexOf("+");
Stringss=sa.substring(index+1);
ss2=ss.replaceFirst("0","00");
}else{
intindex=sa.indexOf("-");
Stringss=sa.substring(index+1);
charb[]=ss.toCharArray();
for(inti=2;icharm='1',n='0';
if(b[i]==m){
b[i]=n;
}else{
b[i]=m;
}
}
if(b[b.length-1]=='0'){
b[b.length-1]='1';
}else{
for(intj=b.length-1;j>=2;j--){
if(b[j-1]=='0'){
b[j-1]='1';
b[j]='0';
break;
}else{
b[j]='0';
}
}
}
Stringsc=newString(b);
ss2=sc.replaceFirst("0","11");
}
returnss2;
}
//做减法时获得第二个数的补码
publicStringwork3(){
Stringsa=d2.getText();
if(sa.startsWith("-")){
intindex=sa.indexOf("-");
Stringss=sa.substring(index+1);
ss2=ss.replaceFirst("0","00");
}else{
intindex=sa.indexOf("+");
Stringss=sa.substring(index+1);
charb[]=ss.toCharArray();
for(inti=2;icharm='1',n='0';
if(b[i]==m){
b[i]=n;
}else{
b[i]=m;
}
}
if(b[b.length-1]=='0'){
b[b.length-1]='1';
}else{
for(intj=b.length-1;j>=2;j--){
if(b[j-1]=='0'){
b[j-1]='1';
b[j]='0';
break;
}else{
b[j]='0';
}
}
}
Stringsc=newString(b);
ss2=sc.replaceFirst("0","11");
}
returnss2;
}
//实现两数补码相加
publicStringadd1(chara1[],chara2[]){
charjg[]=newchar[r];
charcf='0';
while(r>0){
if(a1[r-1]=='0'&&a2[r-1]=='0'&&cf=='0'){
jg[r-1]='0';
cf='0';
}elseif((a1[r-1]=='0'&&a2[r-1]=='0'&&cf=='1')||
(a1[r-1]=='0'&&a2[r-1]=='1'&&cf=='0')||
(a1[r-1]=='1'&&a2[r-1]=='0'&&cf=='0')){
jg[r-1]='1';
cf='0';
}elseif((a1[r-1]=='0'&&a2[r-1]=='1'&&cf=='1')||
(a1[r-1]=='1'&&a2[r-1]=='0'&&cf=='1')||
(a1[r-1]=='1'&&a2[r-1]=='1'&&cf=='0')){
jg[r-1]='0';
cf='1';
}elseif(a1[r-1]=='1'&&a2[r-1]=='1'&&cf=='1'){
jg[r-1]='1';
cf='1';
}else{
jg[r-1]=a1[r-1];
}
r--;
}
Stringresult=newString(jg);
returnresult;
}
3.5定点小数的原码乘法界面
同样,在此界面用户必需要输入乘数和被乘数后执行乘法操作,输入前,用户必需要点击输入按钮才能接获输入框,如输入乘数为+0.1000,被乘数为+0.1101,执行相应的操作得出相应的结果,如下图
Form4模块流程图
Form4模块的主要Java代码
//被乘数转化为原码形式
publicStringwork1(){
Stringa1=t1.getText();
if(a1.startsWith("+")){
intindex=a1.indexOf("+");
s1=a1.substring(index+1);
}else{
intindex=a1.indexOf("-");
Stringss=a1.substring(index+1);
s1=ss.replaceFirst("0","1");
}
returns1;
}
//乘数转化为原码形式
publicStringwork2(){
Stringa2=t2.getText();
if(a2.startsWith("+")){
intindex=a2.indexOf("+");
s2=a2.substring(index+1);
}else{
intindex=a2.indexOf("-");Stringss=a2.substring(index+1);
s2=ss.replac