关于字符串二进制定点数浮点数与int以及NBCD码转换的问题

2023-11-10

关于字符串二进制定点数浮点数与int以及NBCD码转换的问题(代码)

  1. 将十进制数字字符串转化为二进制补码(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;  // 注意有进位不等于溢出,溢出要另外判断   
         }

将负数二进制取反

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();    
        }
  1. 将二进制(字符串)转化为十进制(直接使用库中的方法):
public String binaryToInt(String binStr) {
        return String.valueOf(valueOf(binStr, 2));
            }
  1. 将十进制浮点数转化为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();    }
  1. 将二进制浮点数转化为十进制浮点数
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);    }
  1. 将十进制转化为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);    }
  1. 将NBCD码转化为十进制
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());    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于字符串二进制定点数浮点数与int以及NBCD码转换的问题 的相关文章

随机推荐

  • Day【3】设计一个支持增量功能的栈

    原题链接 文章目录 思路 代码 用数组来模拟栈 思路 题目中已经确切的告诉了我们 数组中会放入多少个元素 这种情况并且只有添加操作 这种情况之下 使用数组模拟效率会更高一点 代码 用数组模拟栈 击败100 class CustomStack
  • 多链生态中的跨链桥是如何运行的?

    在以太坊升级之前 它网络拥堵 手续费高昂等问题逐渐难以满足人们的需求 因此 市场中出现了许多以太坊之外的公链 其中甚至不乏有一些号称 以太坊杀手 项目 尽管以太坊很快反应过来了 并开始对其自身进行升级优化 但一个多链的生态已然形成 在多链态
  • 牛客网 之 数列还原(数列的全排列算法)

    题目描述 牛牛的作业薄上有一个长度为 n 的排列 A 这个排列包含了从1到n的n个数 但是因为一些原因 其中有一些位置 不超过 10 个 看不清了 但是牛牛记得这个数列顺序对的数量是 k 顺序对是指满足 i lt j 且 A i lt A
  • 基于yolov5的物流托盘实时检测方法研究

    摘要 传统物流作业主要依靠人工操作叉车对托盘进行搬运 自动化程度低 工厂实际环境复杂多样 导致现有的托盘检测算法的模型复杂 耗时较长 无法同时达到准确性和实时性要求 难以实际运用 针对浙江某机械 搬运 设备有限公司下属的电动车工业园实际工厂
  • 基于Web日志挖掘的个性化推荐系统(附源码)

    个性化推荐系统 实现该系统主要是使用的编程语言主要是R 然后配合css在样式上进行一定优化 使用shiny开发的一款web程序 主要实现的核心功能是基于spark的ALS算法的课程个性化推荐系统 首页界面如下图所示 该系统中的所有课程名称
  • 低代码点亮普惠数字化转型之路,助力企业数字化转型实践

    在国家大力提倡下 新一代信息技术持续迭代 企业数字化转型被推到风口 现在步入了信息化时代 尤其是2022年 在十四五的政策规划下更是有利好前景 对于企业来说 低代码开发平台是一种通用的解决方案 成为了企业进行信息化管理的首选 现在 越来越多
  • 鸡啄米VS2010/MFC编程入门教程——学习2关于VS2010/MFC/VC/C++

    2015年5月17日15 21 11 VS2010 MFC编程入门之前言 http www jizhuomi com software 137 html 在大学里 有面向对象程序设计这门课程 主要介绍的是C 基础编程 那时候大家虽然都学习了
  • Freemarker中文指南

    序言 目录 一 什么是FreeMarker 二 阅读指南 三 文档约定 四 联系方式 五 关于本文档 一 什么是FreeeMarker FreeMarker是一个模板引擎 是一个基于模板生成文本的通用工具 任何文件都可以基于html自动产生
  • node调用谷歌翻译Api,实现自动国际化

    原因 项目国际化过程繁琐 每次都需要人工去google翻译 导致工作效率不高 需求 1 减少人工的重复劳动 提高工作效率 2 使用脚本调用谷歌翻译接口自动化翻译 3 free 作为程序员肯定接受不了付费服务 找方法解决限制 前期准备 1 谷
  • Java笔记16——优先级队列(堆)

    目录 概念 基于二叉树的堆 二叉堆 基于动态数组ArrayList实现的最大堆 向堆中添加元素 siftUp 在堆中取出最大值 最大堆 3 heapify 堆化 在Java中比较两个元素的大小关系 基于堆的优先级队列到底如何实现 有啥应用
  • 0x00007FFEBAD050D8 处(位于 first.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x0000000DD73CE

    有些时候会出现这种异常 看了网上的一些解释 说有可能是lib文件添置有问题 另一种是路径用成了 我这里给出一种新的可能 那就是图片格式转换错误 这里已经将文件定义为了灰度图像 但是后面使用cvtColor 函数时又将图片转为灰度图像 导致错
  • visio画扇形

    步骤1 首先 选择文件 选项 打开开发工具 步骤2 添加圆形 步骤3 添加两条线 形成扇形的两条边 步骤4 选中圆和线条 在开发工具菜单栏选择操作 修剪 步骤5 选中线条和右边这段弧形 依次选择开发工具 操作 连接 步骤6 拖动该扇形 填充
  • 用代码生成炫酷的词云图—《你好,李焕英》

    最近比较火的电影 你好 李焕英 莫名戳中了大家的泪点 应用评论中的一句 妈妈永远比想象中的要爱我们 虽然我没哭 但看大家都哭了 说明电影不在于多有深意 而是能引起大家共鸣的电影 才是好电影 完全瞎编的 下面我们就来看一下 你好 李焕英 在豆
  • 盛科交换机配置命令_cisco2960交换机 清除配置的命令

    cisco2960交换机 清除配置的命令 1 计算机通过COM端口连接到交机 如果电脑不带COM 需要使用USB转串口线连接交换机 通过超级终端调试 2 当开关通电时 按住开关前面的 模式 按钮 用手按住交换机 Mode 按钮 注意超级终端
  • Uploads-labs靶场练习记录8、9、10-绕过服务端检测(文件后缀)

    这是第八关 1 提示显示不可以上传所有可解析的后缀 那就用png配合htaccess转换php吧 2 成功 这是第九关 1 修改大小写发现还是不能上传 2 后缀加上 DATA上传 成功 这是第十关 1 尝试修改为filename phpin
  • 程序编译链接过程

    文章目录 前言 一 预编译阶段 二 编译阶段 三 汇编阶段 四 链接阶段 总结 前言 include
  • 【msvcp140.dll怎么下载】msvcp140.dll丢失的解决方法

    msvcp140 dll文件对一些电脑软件 电脑游戏等程序的正常运行起到关键性作用 对于弹出缺少此类文件的弹窗 用户们很多时候也摸不着头脑 程序明明上次都能正常运行 突然就弹出缺少msvcp140 dll文件的提醒窗口 通过小编此次编辑的文
  • 多益研发岗视频面试

    03 13 这是自己的第三场面试 自认为面试得还可以 90 以上的问题都答对了 但一个星期后通知说挂了 还是会觉得困惑与可惜 今后再巩固各个知识点吧 39min 1 自我介绍 2 项目介绍 3 项目中有什么亮点或者遇到什么难点 4 说说数据
  • 用HTML做一個酷炫的照片墻,效果非常酷炫。

    下面給大家看看效果 想不想要代碼呢 上代碼
  • 关于字符串二进制定点数浮点数与int以及NBCD码转换的问题

    关于字符串二进制定点数浮点数与int以及NBCD码转换的问题 代码 将十进制数字字符串转化为二进制补码 32位 public String intToBinary String numStr int num Integer parseInt