当前位置:   article > 正文

计组(COA) Programming1: 整数和二进制补码、整数和NBCD码、浮点数(float)和二进制码(IEEE 754)的相互转换。_java nbcd to decical

java nbcd to decical

1、整数转化为二进制补码。

  1. public String intToBinary(String numStr) {
  2. //判断符号
  3. boolean isNeg = numStr.charAt(0) == '-';
  4. //去掉符号位
  5. if(isNeg) numStr = numStr.substring(1);
  6. int num = parseInt(numStr);
  7. StringBuffer binStr = new StringBuffer();
  8. while(binStr.length() != 32)
  9. {
  10. binStr.append(num % 2);
  11. num /= 2;
  12. }
  13. //如果是负数,进行取反加一,此处运用简便方法:从右数第一个‘1’开始,其前每一位取反
  14. //注意此处得到的binStr是反的
  15. if(isNeg)
  16. {
  17. int lastIdx = binStr.indexOf("1");
  18. for(int i = lastIdx + 1; i < binStr.length(); i++)
  19. {
  20. if(binStr.charAt(i) == '0') binStr.setCharAt(i,'1');
  21. else binStr.setCharAt(i,'0');
  22. }
  23. }
  24. return binStr.reverse().toString();
  25. }

2、二进制补码转化为整数。

  1. public String binaryToInt(String binStr) {
  2. StringBuffer buffer = new StringBuffer(binStr);
  3. //判断符号
  4. boolean isNeg = buffer.charAt(0) == '1';
  5. //若是负数,先进行转化
  6. //此处同样运用简便方法
  7. int index = buffer.lastIndexOf("1");
  8. if(isNeg)
  9. for(int i = 1; i < index; ++i)
  10. {
  11. if(buffer.charAt(i) == '0') buffer.setCharAt(i,'1');
  12. else buffer.setCharAt(i,'0');
  13. }
  14. int sum = 0;
  15. for(int i = 1; i < buffer.length(); i++) {
  16. sum += (buffer.charAt(i) - '0') * Math.pow(2, buffer.length() - 1 - i);
  17. }
  18. if(isNeg) sum = -1 * sum;
  19. return (sum+"");
  20. }

3、NBCD码转化为整数

  1. public String NBCDToDecimal(String NBCDStr) {
  2. //将符号位取出,“1100”为正,“1101”为负
  3. String sign = NBCDStr.substring(0,4);
  4. int sum = 0;
  5. for(int i = 4; i < NBCDStr.length() ; i += 4)
  6. {
  7. String subStr = NBCDStr.substring(i,i+4);
  8. sum = sum * 10 + Integer.parseInt(binaryToInt(subStr,4));
  9. }
  10. return (sign.equals("1100") ? sum + "" : "-" + sum);
  11. }
  1. public String binaryToInt(String binStr, int bits)
  2. {
  3. //bits 为binStr的位数
  4. //将binStr转化为无符号整数
  5. int sum = 0;
  6. for(int i = 0; i < binStr.length(); i++)
  7. {
  8. sum += (binStr.charAt(i) - '0') * Math.pow(2,bits - 1 - i);
  9. }
  10. return (sum+"");
  11. }

 

4、整数转化为NBCD码

  1. public String decimalToNBCD(String decimalStr) {
  2. //TODO:
  3. StringBuffer binStr = new StringBuffer();
  4. //判断正负
  5. if(decimalStr.charAt(0) == '-') {
  6. binStr.append("1101");
  7. decimalStr = decimalStr.substring(1);
  8. }
  9. else binStr.append("1100");
  10. //如果位数不够,补'0'
  11. for(int j = 0; j < 7 - decimalStr.length(); j++) binStr.append("0000");
  12. //计算
  13. for(int i = 0; i < decimalStr.length(); i++){
  14. binStr.append(intToBinary(decimalStr.substring(i,i+1),4));
  15. }
  16. return binStr.toString();
  17. }
  1. public StringBuffer intToBinary(String numStr, int bits)
  2. {
  3. //bits为要转化的二进制数的位数
  4. //功能为将某个整数转化为指定位数的二进制码
  5. int num = Integer.parseInt(numStr);
  6. StringBuffer binStr = new StringBuffer();
  7. while(binStr.length() != bits)
  8. {
  9. binStr.append(num % 2);
  10. num /= 2;
  11. }
  12. return binStr.reverse();
  13. }

 

5、浮点数转化为二进制数

  1. public String floatToBinary(String floatStr) {
  2. float num = Float.parseFloat(floatStr);
  3. //为零
  4. if(num == 0.0) return "00000000000000000000000000000000";
  5. else if(num == -0.0) return "10000000000000000000000000000000";
  6. //无穷
  7. else if(num >= Math.pow(2,128)) return "+Inf";
  8. else if(num <= -1 * Math.pow(2,128)) return "-Inf";
  9. StringBuffer res = new StringBuffer();
  10. //符号位
  11. if(num < 0.0) res.append('1');
  12. else res.append('0');
  13. num = Math.abs(num);
  14. //非规格化数
  15. if(num > 0.0 && num < Math.pow(2,-126))
  16. {
  17. res.append("00000000");
  18. //得到0.bbbb...形式的小数
  19. num *= Math.pow(2,126);
  20. res.append(signToBinary(num));
  21. //补‘0’
  22. while(res.length() < 32) res.append("0");
  23. return res.toString();
  24. }
  25. //规格化数
  26. for(int i = -126; i <= 127; i++)
  27. {
  28. if(num >= Math.pow(2,i) && num < Math.pow(2,i+1))
  29. {
  30. //i+127: 127为偏置常数
  31. res.append(intToBinary((i+127)+"",8));
  32. //得到1.bbbbb...形式的小数
  33. num *= Math.pow(2,-1 * i);
  34. res.append(signToBinary(num - 1));
  35. //位数小于32,补零
  36. while(res.length() < 32) res.append("0");
  37. return res.toString();
  38. }
  39. }
  40. return "";
  41. }
  1. public String signToBinary(float num)
  2. {
  3. //函数功能为将小数转化为二进制数
  4. StringBuffer res = new StringBuffer();
  5. while(num != 0.0)
  6. {
  7. num *= 2;
  8. if(num >= 1)
  9. {
  10. res.append('1');
  11. num -= 1;
  12. }
  13. else res.append('0');
  14. }
  15. return res.toString();
  16. }
  1. public StringBuffer intToBinary(String numStr, int bits)
  2. {
  3. int num = Integer.parseInt(numStr);
  4. StringBuffer binStr = new StringBuffer();
  5. while(binStr.length() != bits)
  6. {
  7. binStr.append(num % 2);
  8. num /= 2;
  9. }
  10. return binStr.reverse();
  11. }

6、二进制数转化为浮点数

  1. public String binaryToFloat(String binStr) {
  2. //取出相应部分:符号位,阶码,小数
  3. char sign = binStr.charAt(0);
  4. String order = binStr.substring(1,9);
  5. String significant = binStr.substring(9);
  6. StringBuffer res = new StringBuffer(sign == '0' ? "" : "-");
  7. //阶码
  8. int trueOrderNum = 0;
  9. int OrderNum = Integer.parseInt(binaryToInt(order,8));
  10. //非规格化数
  11. if(OrderNum == 0) trueOrderNum = -126;
  12. //规格化数
  13. else if(OrderNum != 255) trueOrderNum = OrderNum - 127;
  14. //小数部分
  15. float num = binToSignificant(significant);
  16. //无穷
  17. if(num == 0 && OrderNum == 255) return (sign == '1') ? "-Inf" : "+Inf";
  18. //非数
  19. else if(num != 0 && OrderNum == 255) return "NaN";
  20. //非规格化数隐藏位为0,规格化数隐藏位为1
  21. else if(OrderNum != 0) num += 1;
  22. res.append(num * Math.pow(2,trueOrderNum));
  23. return res.toString();
  24. }
  1. public float binToSignificant(String binStr)
  2. {
  3. //二进制码转小数
  4. float res = 0;
  5. for(int i = 0; i < binStr.length(); i++) {
  6. res += (binStr.charAt(i) - '0') / Math.pow(2,(i+1));
  7. }
  8. return res;
  9. }
  1. public String binaryToInt(String binStr, int bits)
  2. {
  3. int sum = 0;
  4. for(int i = 0; i < binStr.length(); i++)
  5. {
  6. sum += (binStr.charAt(i) - '0') * Math.pow(2,bits - 1 - i);
  7. }
  8. return (sum+"");
  9. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/258402?site
推荐阅读
相关标签
  

闽ICP备14008679号