C++任意数字类型转 2进制、8进制、16进制

2023-11-18

C++任意数字类型转 2进制、8进制、16进制

平时我们在写程序的过程中会经常碰见进制转换的操作,偶尔写一次还好每次写,我们都又要重新定义函数进行转换;在这里博主就分享一下我自己编写的一个进制转换的方法吧,也比较通用;

(如没有耐心可以直接跳过思路 看尾部的源代码)
先说说我的思路(这里折中介绍转8进制的思路,转16进制大同小异)
1、将整数转换成二进制格式 以字符串的形式存放;在这里插入图片描述
博主在这里使用的是模板函数,这样可以提高函数的兼容性,然后呢在这里转换成二进制 的方法我采用的是位运算来进行的操作,这样的好处是极大的提高了程序的效率
稍微的这里解释一下这种算法的逻辑:
举个例子比如我们传进来的参数是10
我们要将10 转换成二进制格式;
10 在计算机的内存地址本身就是以二进制的方式存放的
10(binary 1010)
这个二进制数的最高位是 第4位
1 << 3 的意思呢就是 将1往左移3位 0001(1) => 1000(8)
10 & (1<< 3) => 1010 & 1000
&运算符呢是位运算符里的按位与 什么意思呢就是两个二进制数 相同位上如果都为1
那么这个表达式的值为1 否则为0
10 & (1<< 3) => 1010 & 1000 = 1
10 & (1<< 2) => 1010 & 100 = 0
10 & (1<< 1) => 1010 & 10 = 1
10 & (1<< 0) => 1010 & 1 = 0
好这样就得到了 10 十进制数的二进制格式 1010

2、检索二进制长度是否为3的倍数如果不是前面补0;
在这里插入图片描述
这一步操作就是用来补“0” 的为什么要这么做请看下一步的的讲解

3、将这个字符串进行拆分(3个为一组)例如“010” 我们就把它看作成 2
在这里插入图片描述
我们之所以要把二进制字符串补成3的倍数,就是因为我们把这个二进制字符的子串长度为3分成一组 例如 ”001010100“ =》 ”001“ ”010“ ”100“
如图我我们采用的if else if 来进行字符串的(switch 只能比较 数字类型的 )
下面理下这一步操作的过程:
例子 1259传进来 转换城二进制 =》 10011101011
补零 =》 010011101011
拆分 =》 010 011 101 011
比对 =》 --2----3----5----3

4、定义字符串变量s_oct 一直合并迭代上面的结果;
这一步的操作就简单了 就是 定义一个字符串 s_oct = ”\0“;
让后把上面一步得到的 --2----3----5----3
每个数字以字符串的形式叠加起来:
s_oct + 2 + 3 + 5 + 3 = 2353

5、最后输出s_oct;
所以1259的八进制形式就是2353;
return s_oct;

整个案例的源代码

template<typename T>
string to_binary(T num,int n){
    string s_bin="\0",s_oct="\0",s_hex="\0";
    int i = sizeof(T)*8-1;
    while(!(num & (1<<i))){
        i--;
    }
    for(int j=i;j>=0;j--){
        if(num & (1<<j)){
            s_bin += "1";
        }
        else{
            s_bin += "0";
        }
    }
    if(n == 2){
        return s_bin;
    }
    if(n == 8){
        while(s_bin.length()%3!=0){
            s_bin = "0"+s_bin;
        }
        for(int j=0;j<(int)s_bin.length();j+=3){
            string sub_str = s_bin.substr(j,3);// 注意substr的第一个参数代表起始点 第二个参数代表偏移量
            if(sub_str == "000"){s_oct += "0";}
            else if(sub_str == "001"){s_oct += "1";}
            else if(sub_str == "010"){s_oct += "2";}
            else if(sub_str == "011"){s_oct += "3";}
            else if(sub_str == "100"){s_oct += "4";}
            else if(sub_str == "101"){s_oct += "5";}
            else if(sub_str == "110"){s_oct += "6";}
            else if(sub_str == "111"){s_oct += "7";}
        }
       return s_oct;
    }
    if(n == 16){
        while(s_bin.length()%4!=0){
            s_bin = "0"+s_bin;
        }
        for(int j=0;j<(int)s_bin.length();j+=4){
            string sub_str = s_bin.substr(j,4);
            if(sub_str == "0000"){s_hex += "0";}
            else if(sub_str == "0001"){s_hex += "1";}
            else if(sub_str == "0010"){s_hex += "2";}
            else if(sub_str == "0011"){s_hex += "3";}
            else if(sub_str == "0100"){s_hex += "4";}
            else if(sub_str == "0101"){s_hex += "5";}
            else if(sub_str == "0110"){s_hex += "6";}
            else if(sub_str == "0111"){s_hex += "7";}
            else if(sub_str == "1000"){s_hex += "8";}
            else if(sub_str == "1001"){s_hex += "9";}
            else if(sub_str == "1010"){s_hex += "A";}
            else if(sub_str == "1011"){s_hex += "B";}
            else if(sub_str == "1100"){s_hex += "C";}
            else if(sub_str == "1101"){s_hex += "D";}
            else if(sub_str == "1110"){s_hex += "E";}
            else if(sub_str == "1111"){s_hex += "F";}
        }
        return s_hex;
    }
    return "EOF";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++任意数字类型转 2进制、8进制、16进制 的相关文章

随机推荐

  • win10家庭中文版开启Hyper-V功能

    问题描述 由于win10家庭中文版是被阉割过的 有些功能就被禁用了 启用和禁用程序中就没有了Hyper V功能 如果想要更多的功能可以将系统升级成为专业版和企业版即可解决 但如果想直接在家庭中文版下创建也是可行 这里有一位大神给出了自己的方
  • LeetCode题解--160. 相交链表

    题目 编写一个程序 找到两个单链表相交的起始节点 例如 下面的两个链表 A a1 a2 c1 c2 c3 B b1 b2 b3 在节点 c1 开始相交 注意 如果两个链表没有交点 返回 null 在返回结果后 两个链表仍须保持原有的结构 可
  • html5中拖放,HTML5中的拖放

    关于HTML5中的拖放 拖放 Drag 和 Drop 是一种常见的特性 即抓取对象以后拖到另一个位置 在 HTML5 中 拖放是标准的组成部分 在HTML5中用户可以使用鼠标选择一个可拖动元素 将元素拖动到一个可放置元素 并通过释放鼠标按钮
  • OpenHarmony dump渲染和合成图层SurfaceBuffer指南

    OpenHarmony dump渲染和合成图层SurfaceBuffer指南 引言 博客停更很久了 提起笔来渐感生疏啊 看来 还是得抽出时间来更新更新啊 好了 感慨也发完了 是时候切入正题了 本篇博客主要以本人在实际项目的开发中 为了定位O
  • 韩信点兵的算法

    秦朝末年 楚汉相争 韩信率兵打仗 某次 他急需点兵迎战 就命士兵布阵三次 命3人一排 多出2名 命5人一排 多出3名 命7人一排 多出2名 后 直言有1073名勇士可击垮敌兵 其神机妙算鼓舞士气 旌旗摇动 大败楚军 首先这个故事的真实性很低
  • Linux下用户的创建与删除

    我们在Linux下创建用户主要有两种方式 adduser和useradd 它们的区别以及主要用法如下 adduser adduser的用法很简单 只需adduser username即可 如下 sudo adduser alvin 这个命令
  • python深入笔记--装饰函数

    装饰函数的参数是被装饰的函数对象 返回原函数对象 装饰的实质语句 hanshu zhuangshi hanshu 第一步 最简单的函数 第二步 对函数进行装饰 hanshu zhuangshi hanshu 定义zhuangshi函数功能
  • Vue中vuex的使用(四)

    四个map方法的使用 1 mapState方法 用于帮助我们映射state中的数据为计算属性 computed 借助mapState生成计算属性 sum school subject 从state中读取数据 对象写法 mapState su
  • RISCV架构单周期CPU设计

    指令选取 R类型指令 31 25 24 20 20 19 15 14 11 7 6 0 funct7 rs2 rs1 funct3 rd opcode 编号 指令 名称 1 add rd rs1 rs2 加 2 and rd rs1 rs2
  • 6个Python童年小游戏,开始敲起来,玩吧!

    你的童年 我的童年好像都一样 谁的童年又没玩过游戏呢 这些小游戏应该只有玩过才会懂吧 虽然程序员敲代码多年 但童心还是一直都在的 今天就分享一些私藏的童年游戏 十几行代码就能进入使用Python开发的小游戏快乐玩耍 1 五子棋 童年游戏不可
  • STM32驱动_旋转编码器EC11(中断触发版本)

    STM32驱动 旋转编码器EC11 中断触发版本 说明 根据示波器测量的真实波形 可以看到 旋转编码器转动一格 实际上只有波形的一个电平变化 并不是输出一个完整周期的波形 中断触发方案 将旋转编码器的A和B两个引脚设置为A下降沿触发 B上升
  • SQL 通配符

    在 SQL 中 通配符与 SQL LIKE 操作符一起使用 SQL 通配符用于搜索表中的数据 在 SQL 中 可使用以下通配符 通配符 描述 替代 0 个或多个字符 替代一个字符 charlist 字符列中的任何单一字符 charlist
  • 家庭IOT监测之摄像头数据上传ONENET

    本篇目标 将摄像头OV7670的照片数据 转换成BMP二进制 上传到ONENET平台 用于远程监测 材料准备 之前移植的温湿度及红外修改工程 温湿度及红外修改工程 继续往里面移植摄像头驱动上传代码 STM32F407最终摄像头上传ONENE
  • MQTT Qos详解(一)

    本文基于标准MQTT讨论 不适合其他对MQTT机制做了修改的非标准MQTT协议 MQTT设计了一套保证消息稳定传输的机制 包括消息应答 存储和重传 在这套机制下 提供了三种不同层次QoS Quality of Service QoS0 发送
  • 信息抽取(四)【NLP论文复现】Multi-head Selection和Deep Biaffine Attention在关系抽取中的实现和效果

    Multi head Selection和Deep Biaffine Attention在关系抽取中的应用 前言 Multi head Selection 一 Joint entity recognition and relation ex
  • Hash table and application in java

    查找的效率取决于在查找是比较的次数 次数越少效率越高 反之越低 最理想的情况是无需比较 一次存取便能找到所查找的记录 根据对应关系f找到给定值K的像f K hash function 应运而生 由此思想建的表称为hash table 集合h
  • MySQL 文本字符串

    mysql文本字符串主要包括 CHAR VARCHAR TINYTEXT TEXT MEDIUMTEXT LONGTEXTENUM SET 等类型 char用于储存固定长度的字符串 定长就是电话号码 一般需要声明字符串长度 如果你没有声明它
  • vue基于threejs实现的3D可视化编辑器

    随着5G网络的渐渐普及 物联网在人们的生活中渐渐广泛使用 社会向着越来越智能化的方向发展 当康科技经过不懈努力 研发属于自己的一款3D可视化编辑器 助力企业应用实现3D可视化服务 编辑器界面如下 操作视频演示 3D可视化编辑器v1 0版本完
  • styled-components组件升级v4版本的全局样式踩坑

    注 本文使用ES6 Module模块化 框架选用React 最新版的 styled components v4 已经将原有的 injectGlobal 方法替换成了 createGlobalStyle 而且用法也和之前的 injectGlo
  • C++任意数字类型转 2进制、8进制、16进制

    C 任意数字类型转 2进制 8进制 16进制 平时我们在写程序的过程中会经常碰见进制转换的操作 偶尔写一次还好每次写 我们都又要重新定义函数进行转换 在这里博主就分享一下我自己编写的一个进制转换的方法吧 也比较通用 如没有耐心可以直接跳过思