关于二进制整数的加减法以及其他运算

关于二进制整数以及IEEE754标准下的加减法以及其他运算(即用代码实现ALU)

  1. 用ALU封装类实现整数二进制的加减乘除以及求余数、逻辑以及算数左右移的方法。
package cpu.alu;
import transformer.Transformer;
import util.BinaryIntegers;
import util.IEEE754Float;
import java.util.Arrays;
public class ALU {
    // 模拟寄存器中的进位标志位    
    private String CF = "0";
    // 模拟寄存器中的溢出标志位    
    private String OF = "0";
    private Transformer t =new transformer();
    //add two integer    
    String add(String src, String dest) {
        return adder(src,dest,'0',32);        
       }
    //补全32位然后进行计算加法
    private String adder(String operand1,String operand2,char c,int length){
    	operand1=impleDigits(operand1,length);
    	operand2=impleDigits(operand2,length);
    	String res=carry_adder(operand1,operand2,c,length);
    	OF=""+addOverFlow(operand1,operand2,res);
    	return res;
    }
    //补全32位方法,reverse原因:StringBuffer方法是在后面加上对应的位数
    private String impleDigits(String operand,int length){
    	int len=length-operand.length();
    	char imple =operand.charAt(0);//根据符号位补全
    	StringBuffer res=new StringBUffer(new StringBuffer(operand).reverse());
    	for(int i=0;i<len,i++){
    		res=res.append(imple);}
    	return res.reverse().toString();}
    //进位加法器,根据第一位是否为1来判断是否有溢出
    private String carry_adder(String operand1,String operand2,char c,int length){
    	operand1=impleDigits(operand1,length);
    	operand2=impleDigits(operand2,length);
    	String res="";
    	char carry=c;
   	for(int i=length-1;i>=0;i--){
       		String temp=fullAdder(operand1.charAt(i),operand2.charAt(i),carry);
       		carry=temp.charAt(0);
       		res=temp.charAt(1)+res;
       }
       	CF=""+carry;
       	return res;
       }
    //单位运算
    private String fullAdder(char x,char y,char c){
    	int bit=(x-'0')^(y-'0')^(c-'0');
    	int carry=((x-'0')&(y-'0'))|((y-'0')&(c-'0'))|((x-'0')&(c-'0'));
    	return ""+carry+bit;
    	}
    private String adderOverFlow(String operand1,String operand2,String result){
    	int X=operand1.charAt(0)-'0';
    	int Y=operand2.charAt(0)-'0';
    	int S=result.charAt(0)-'0';
    	return ""+((~X&~Y&S)|(X&Y&~S));
    	}
    //sub two integer    // dest - src    
    String sub(String src, String dest) {
        return adder(src,negation(dest),'1',32);}
    //将对应的二进制取反
    public String negation(String operand){
    	StringBuffer result=new StringBuffer();
    	for(int i=0;i<operand.length();i++){
    		result=operand.charAt(i)=='1'?result.append("0"):result.append("1");}
    	return result.toString();}

    //signed integer mod    
    String imod(String src, String dest) {
    	String temp=dest;
    	if(src.charAt(0)=='0'&&dest.charAt(0)=='0'){
    	  while(isLarger(temp,src)||temp.equals(src)){
    	    temp=sub(src,temp);}
    	if(src.charAt(0)=='0'&&dest.charAt(0)=='1'){
    	  while(isLarger("00000000000000000000000000000000",temp)||temp.equals("00000000000000000000000000000000")){
    	    temp=add(src,temp);}
    	  temp=sub(src,temp);}
    	if(src.charAt(0)=='1'&&dest.charAt(0)=='0'){
    	  while(isLarger(temp,"00000000000000000000000000000000")||temp.equals("00000000000000000000000000000000")){
    	  temp=add(src,temp);}
    	  temp=sub(src,temp);}
    	if(src.charAt(0)=='1'&&dest.charAt(0)=='1'){
    	  while(isLarger(src,temp)||temp.equals(src)){
    	  temp=sub(src,temp);}}
    	  return temp;
    	}
    String and(String src, String dest) {       
    	char[] result =new char[] ;
    	for(int i=0;i<src.length();i++){
    	   char srcItem=src.charAt(i);
    	   char desItem=dest.charAt(i);
    	   result[i]=(char)(srcItem&desItem);
    	      }
    	StringBuilder resultStr =new StringBuilder(32);
    	for(char s:result){
    	  resultStr.append(s);}
    	return resultStr.toString();}
    String or(String src, String dest) {      
    	char[] result=new char[32];
    	for(int i=0;i<src.length;i++){
    	  char srcItem=src.charAt(i);
    	  char destItem=dest.charAt(i);
    	  result[i]=(char)(srcItem|destItem);}
    	StringBuilder resultStr =new StringBuilder(32);
        for(char s:result){
       	  resultStr.append(s);}
       return resultStr.toString();}

    String xor(String src, String dest) {     
    	char[] result = new char[32];
        for (int i = 0; i < src.length(); i++) {
            char srcItem = src.charAt(i);
            char destItem = dest.charAt(i);
            if (srcItem == destItem)
                result[i] = '0';
            else
                result[i] = '1';
        }
        StringBuilder resultStr = new StringBuilder(32);
        for (char s : result) {
            resultStr.append(s);
        }
        return resultStr.toString();
    }  }
    String shl(String src, String dest) {       
      return sal(src, dest);    }
    String shr(String src, String dest) {      
      int shift = Math.abs(Integer.parseInt(transformer.binaryToInt("0" + src.substring(src.length()-5))));
      char[] fill = new char[32];
      Arrays.fill(fill, '0');
      return new String(fill).concat(dest).substring(32 - shift, 64 - shift);  }
    String sal(String src, String dest) {    
    	int shift = Math.abs(Integer.parseInt(transformer.binaryToInt("0" + src.substring(src.length()-5))));
  	char[] fill = new char[32];
  	Arrays.fill(fill, '0');
  	return dest.substring(shift).concat(new String(fill)).substring(0, 32);//concat为合并    }
    String sar(String src, String dest) {       
    	int shift = Math.abs(Integer.parseInt(transformer.binaryToInt("0" + src.substring(src.length()-5))));
        char[] fill = new char[32];
        Arrays.fill(fill, dest.charAt(0));
        return new String(fill).concat(dest).substring(32 - shift, 64 - shift);    }
    String rol(String src, String dest) {        
    	int shift = Math.abs(Integer.parseInt(transformer.binaryToInt("0" + src.substring(src.length()-5))));
        return dest.substring(shift).concat(dest.substring(0, shift));    }
    String ror(String src, String dest) {        
    	int shift = Math.abs(Integer.parseInt(transformer.binaryToInt("0" + src.substring(src.length()-5))));
        return dest.substring(32 - shift).concat(dest.substring(0, 32 - shift));    }
}
考虑正负形,二进制小数的加减法需要一些特殊的处理步骤。以下是详细的介绍: ### 二进制小数的表示 二进制小数与十进制小数类似,但使用二进制位来表示。例如,十进制的0.625可以表示为二进制的0.101(即1/2 + 0/4 + 1/8)。 ### 正负形表示 在二进制中,正数和负数可以通过符号位来表示。通常,最高位(最左边的位)用来表示符号,0表示正数,1表示负数。例如: - -5 表示为 1101 ### 二进制小数的加法 二进制小数的加法与整数的加法类似,但需要处理小数点。以下是步骤: 1. 对齐小数点:确保两个数的二进制表示中,小数点的位置相同。 2. 从最低位开始相加,逢二进一。 3. 处理符号位:如果两个数符号相同,直接相加;如果符号不同,需要进行减法操作。 ### 二进制小数的减法 二进制小数的减法可以通过加法来实现,具体步骤如下: 1. 将减数取反(即每个位取反)。 2. 将取反后的减数加1,得到其补码。 3. 将被减数与减数的补码相加。 4. 处理符号位:如果结果为正数,直接得到结果;如果结果为负数,取其补码。 ### 示例 假设我们要计算 0.101(十进制的0.625) + 0.010(十进制的0.25): 1. 对齐小数点: ``` 0.101 + 0.010 ``` 2. 从最低位开始相加: ``` 0.101 + 0.010 ------- 0.111 ``` 结果为 0.111,即十进制的0.875。 ### 总结 二进制小数的加减法整数加减法类似,但需要额外处理小数点和对齐问题。通过符号位和补码的方法,可以实现正负数的运算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值