문자열 2진수 부동 소수점 수와 int 및 NBCD 코드 변환에 대한 질문

문자열 바이너리 점 부동 소수점 및 int 및 NBCD 코드 변환에 대한 질문(코드)

  • 십진수 문자열을 이진수 부호로 바꾸기(32비트):
  • public String intToBinary(String numStr) {
            int num = Integer.parseInt(numStr);        
            if (num == 0) return "00000000000000000000000000000000";  //0                  
            boolean isNeg = false;        
            if (num < 0) {  //                 
            num = -num;            
            isNeg = true;        
            }        
            StringBuilder temp = new StringBuilder();        
            while (num > 0) {  //                 
            if (num % 2 == 1) temp.append("1");            
            else temp.append("0");            
            num /= 2;        }        
            String ans = temp.reverse().toString();  //  ,               
            int len = ans.length();        
            for (int i = 0; i < 32 - len; i++) ans = "0" + ans;        
            if (isNeg) {  //                       
            ans = oneAdder(negation(ans)).substring(1);        
            }        
            return ans;    
            }

    진위 판단 (첫 번째 판단 넘침 여부)
    private String oneAdder(String operand) {
            int len = operand.length();        
            StringBuffer temp = new StringBuffer(operand);        
            temp = temp.reverse();//      ,                   
            int[] num = new int[len];        
            for (int i = 0; i < len; i++) num[i] = temp.charAt(i) - '0';  //           int          
            int bit = 0x0;        
            int carry = 0x1;        
            char[] res = new char[len];        
            for (int i = 0; i < len; i++) {            
            bit = num[i] ^ carry;            
            carry = num[i] & carry;            
            res[i] = (char) ('0' + bit);  //      char        
            }        
            String result = new StringBuffer(new String(res)).reverse().toString();        
            return "" + (result.charAt(0) == operand.charAt(0) ? '0' : '1') +result;  //           ,          
             }

    마이너스 2진법을 반대로 하다
    private 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();    
            }
  • 바이너리(문자열)를 10진법으로 전환(라이브러리에서 직접 사용하는 방법):
  • public String binaryToInt(String binStr) {
            return String.valueOf(valueOf(binStr, 2));
                }
  • 십진수 부동점수를 32비트 단정밀도 부동점수로 전환(비교적 어렵고 주요 원인: 표시 여부를 판단해야 함):
  • public String floatToBinary(String floatStr) {
            int eLength = 8;//           
            int sLength = 23;//   
            double d = Double.valueOf(floatStr);        
            boolean isNeg = d < 0;
            if (Double.isNaN(d)) {            
            return "Nan";        }        
            if(!isFinite(d, eLength, sLength)){
                        return isNeg ? "-Inf" : "+Inf";        }
            StringBuilder answer = new StringBuilder(1+eLength+sLength);
            if(isNeg) answer.append("1");
            else answer.append("0");
            if(d == 0.0) {            
                for(int i=0;i<eLength+sLength;i++){
                            answer.append("0");            }            
                            return answer.toString();        } 
                            else {           
                             d = Math.abs(d);          
                               int bias = (int)((maxValue(eLength)+1)/2-1);  // bias            
                               boolean subnormal = (d < minNormal(eLength,sLength));
                if(subnormal){                
                for(int i=0;i<eLength;i++){                    
                answer.append("0");                }                
                d = d * Math.pow(2, bias-1);  //     
                    answer.append(fixPoint(d, sLength));            }            
                    else{
                    int exponent = (int)getExponent(d);          
                    answer.append(integerRepresentation(String.valueOf((int(exponent+bias)),eLength));  //    bias                d = d / Math.pow(2, exponent);
                    answer.append(fixPoint(d-1, sLength));  // fixPoint         1,                    }      
                      }        return answer.toString();  
                        }

    32비트 완성
    private String integerRepresentation(String number, int length) {
            String result = intToBinary(number);        
            return result.substring(32 - length);    }

    부동점수를 이진법으로 표시할 수 있는지 판단(IEEE754 표준에 표시된 범위)
    private boolean isFinite(double d, int eLength, int sLength) {
            int bias = (int) ((maxValue(eLength) + 1) / 2 - 1);  // bias        
            int exponent = (int) (maxValue(eLength) - 1 - bias - sLength);  //    1  0     ,                 ,  -1,    significand               
            double significand = maxValue(sLength + 1);  //              
            double result = significand * Math.pow(2, exponent);       
             return d >= -result && d <= result;    }

    표시할 수 있는 최대 부동점수를 계산하다
    private double maxValue(int length) {
            //                
            return Math.pow(2, length) - 1;    }

    표시할 수 있는 최소 부동점수를 계산하다
    private double minNormal(int eLength, int sLength) {
            int bias = (int) ((maxValue(eLength) + 1) / 2 - 1);  // bias        return Math.pow(2, 1 - bias);  //    1,   0    }

    움직이지 않다
    private String fixPoint(double d, int sLength) {
            d = d < 1 ? d : d - (int) d;  // d = 0.xxxxx       
             StringBuilder res = new StringBuilder();        
             int count = 0;        
             while (d != 0 && count < sLength) {           
              d *= 2;            
              if (d < 1) {                
              res.append("0");            } 
              else {                
              d -= 1;                
              res.append("1");            }            
              count++;  //    sLength           }        
              int len = res.length();  //      res.length()       
               for (int i = 0; i < sLength - len; i++) res.append(0);        
               return res.toString();    }
  • 2진 부동점수를 10진 부동점수
  • 로 전환
    public String binaryToFloat(String binStr) {
            boolean isNeg = (binStr.charAt(0) == '1');        
            String exp = binStr.substring(1, 9);        
            String frag = binStr.substring(9);
            if (exp.equals("11111111")) {            
            if (frag.contains("1")) {                
            return "NaN";            } 
            else {               
             return isNeg ? "-Inf" : "+Inf";            }        }
              else if (exp.equals("00000000")) {            
              if (frag.contains("1")) {               
               double f = 0.0;                
               int fe = 1;                
               for (char fc:frag.toCharArray()) {                    
               f += Integer.parseInt(String.valueOf(fc)) / Math.pow(2, fe);                    
               fe++;                }                
               f = (f)*Math.pow(2, -126);               
                f = isNeg ? -f : f;               
                 return String.valueOf(f);            } 
                 else {                return "0.0";            }        }
                        double f = 0.0;        
                        int fe = 1;        
                        for (char fc:frag.toCharArray()) {            
                        f += Integer.parseInt(String.valueOf(fc)) / Math.pow(2, fe);            
                        fe++;        }
                         int e = valueOf(exp, 2) - 127;       
                          f = (1+f)*Math.pow(2, e);        
                          f = isNeg ? -f : f;
                          return String.valueOf(f);    }
  • 10진수를 NBCD 코드
  • 로 변환
    public String decimalToNBCD(String decimal) {       
     return getBCDString(Integer.parseInt(decimal));    }
    public String getBCDString(int val) {
            String sign = val < 0 ? "1101" : "1100"; //            
             String result = "";        
             val = Math.abs(val);        
             int i = 7;        
             while (i > 0) {            
             int tmpVal = val % 10;            
             result = getBCDString_4(tmpVal).concat(result);            
             val = val / 10;            
             i--;        }        
             return sign.concat(result);    }
  • NBCD 코드를 10진수로 변환
  • public String NBCDToDecimal(String NBCDStr) {
            return String.valueOf(NBCDTrueValue(NBCDStr));    }
    private int NBCDTrueValue(String operand) {
            StringBuilder ans = new StringBuilder();        
            if (operand.startsWith("1101")) ans.append('-');        
            operand = operand.substring(4);        
            for (int i = 0; i < operand.length() && i < 28; i += 4) {
               ans.append(Integer.valueOf(operand.substring(i, i + 4), 2));        }        
               return Integer.parseInt(ans.toString());    }

    좋은 웹페이지 즐겨찾기