用数组存储32位单精度浮点数,并且实现有效位右移,有效数加法等,可用于计算机浮点加减法的底层模拟。
1 package com.computerOrganizationAndArchitecture.floatQperation; 2 3 import com.computerOrganizationAndArchitecture.singleprecisionfloat.SinglePrecision; 4 5 /** 6 * Created by XuTao on 2018/12/8 20:24 7 * 这里用数组来存储32位的浮点数, 8 */ 9 public class BinaryArray { 10 protected int [] binArr; 11 private int len; 12 public BinaryArray(){ 13 len = 32; 14 binArr = new int[32]; 15 } 16 public BinaryArray(String s){ 17 len =32; 18 binArr = new int[32]; 19 for (int i =0 ;i<32;i++){ 20 binArr[i] = s.charAt(i)==‘1‘?1:0; 21 } 22 } 23 public BinaryArray(String s,int len){ //自定义长度 24 this.len =len; 25 binArr = new int[len]; 26 for (int i =0 ;i<len;i++){ 27 binArr[i] = s.charAt(i)==‘1‘?1:0; 28 } 29 } 30 public BinaryArray(double n){ 31 len =32; 32 binArr = new int[32]; 33 String ss= new SinglePrecision().Float2Binary(n);//https://www.cnblogs.com/XT-xutao/p/9906351.html 34 String s= ss.charAt(0)+ss.substring(2,10)+ss.substring(11); 35 for (int i =0 ;i<32;i++){ 36 binArr[i] = s.charAt(i)==‘1‘?1:0; 37 } 38 } 39 40 public void shiftRight(int n){//右移n位 41 int [] temp = new int[n]; 42 for (int i=23;i>=n;i--){//移动 43 binArr[i]=binArr[i-n]; 44 } 45 for (int i=0;i<n;i++){//补0 46 binArr[i]=0; 47 } 48 } 49 public String toString(){ 50 String s= ""; 51 for (int i =0;i<len;i++){ 52 s+=binArr[i]; 53 } 54 return s; 55 } 56 public String toString(int []binArr){ 57 String s= ""; 58 for (int i =0;i<binArr.length;i++){ 59 s+=binArr[i]; 60 } 61 return s; 62 } 63 public String toExpString(){ 64 String s= ""; 65 for (int i =1;i<9;i++){ 66 s+=binArr[i]; 67 } 68 return s; 69 } 70 public String toSignificandString(){ // 24位的 71 String s= ""; 72 for (int i =9;i<len;i++){ 73 s+=binArr[i]; 74 } 75 return "1"+s; 76 } 77 public int getExp (){ 78 return Integer.valueOf(toExpString(),2); 79 } 80 81 public static int[] add(String a,String b){//N位二进制+1位进位(0/1)相加 =N+1位 82 //a,b长度要相等 83 int [] temp = new int[a.length()+1]; 84 int [] arr1 = (new BinaryArray(a,a.length())).binArr; 85 int [] arr2 = (new BinaryArray(b,b.length())).binArr; 86 int carry = 0; 87 for (int i =a.length()-1;i>=0;i--){ 88 temp[i+1] = arr1[i]+arr2[i]+carry; 89 carry=0; 90 if (temp[i+1]==2){ 91 temp[i+1]=0; 92 carry = 1; 93 } 94 if (temp[i+1]==3){ 95 temp[i+1]=1; 96 carry = 1; 97 } 98 } 99 //最高位进位 100 temp[0] = carry==1?1:0; 101 return temp; 102 } 103 104 public int[] getNegative(){ 105 int [] temp = new int[32]; 106 for (int i=0;i<32;i++){ 107 108 } 109 return temp; 110 } 111 112 public static void main(String[] args) { 113 BinaryArray ba = new BinaryArray(-879.5); 114 System.out.println(ba.toString()); 115 //11000100 01011011 11100000 00000000 116 System.out.println(ba.toSignificandString()); 117 118 } 119 120 }
原文地址:https://www.cnblogs.com/XT-xutao/p/10111224.html
时间: 2024-10-09 19:46:09