二进制、八进制、十进制、十六进制相互转换

1. 十进制整数 转 二进制字符串

1.1 位运算方式实现

代码如下:

template<typename T>
std::string Dec2Bin(T val, bool bHighBitFillZero)
{
    std::string strRet;
    bool bFirstZero = true;
    int iSize = sizeof(T) * 8;

    for (int i = iSize - 1; i >= 0; i--) {
        if (val & (1 << i)) {
            strRet.append("1");
            bFirstZero = false;
        }
        else {
            if (!bFirstZero || bHighBitFillZero) {
                strRet.append("0");
            }
        }
    }
    return strRet;
}

模板参数T:只能为整数类型:short, int, unsigned int, long等。
bHighBitFillZero:表示高位是否填充0。

Dec2Bin<int>(0x10, true)  --> 00000000000000000000000000010000
Dec2Bin<int>(0x10, false) --> 10000

1.2 union联合体方式实现

代码如下:

#include <string>
#include <stdio.h>

std::string IntTo32Bin(int n) {
    union A {
        int x;
        struct {
            unsigned char b0 : 1;
            unsigned char b1 : 1;
            unsigned char b2 : 1;
            unsigned char b3 : 1;
            unsigned char b4 : 1;
            unsigned char b5 : 1;
            unsigned char b6 : 1;
            unsigned char b7 : 1;
            unsigned char b8 : 1;
            unsigned char b9 : 1;
            unsigned char b10 : 1;
            unsigned char b11 : 1;
            unsigned char b12 : 1;
            unsigned char b13 : 1;
            unsigned char b14 : 1;
            unsigned char b15 : 1;
            unsigned char b16 : 1;
            unsigned char b17 : 1;
            unsigned char b18 : 1;
            unsigned char b19 : 1;
            unsigned char b20 : 1;
            unsigned char b21 : 1;
            unsigned char b22 : 1;
            unsigned char b23 : 1;
            unsigned char b24 : 1;
            unsigned char b25 : 1;
            unsigned char b26 : 1;
            unsigned char b27 : 1;
            unsigned char b28 : 1;
            unsigned char b29 : 1;
            unsigned char b30 : 1;
            unsigned char b31 : 1;
        };
    };

    A a;
    a.x = n;
    
    char szBuf[33];
    sprintf_s(szBuf, 33, 
        "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",
        a.b31, a.b30, a.b29, a.b28, a.b27, a.b26, a.b25, a.b24, a.b23, a.b22, a.b21, a.b20, a.b19, a.b18, 
        a.b17, a.b16, a.b15, a.b14, a.b13, a.b12, a.b11, a.b10, a.b9, a.b8, a.b7, a.b6, a.b5, a.b4, a.b3, a.b2, a.b1, a.b0);

    return szBuf;
}

1.3 模运算方式实现

代码如下:

template<typename T>
std::string Dec2Bin2(T val, bool bHighBitFillZero)
{
    std::string strValue;
    std::string strRet;
    std::vector<unsigned char> vBin;

    while (val != 0) {
        vBin.push_back(val % 2);
        val /= 2;
    }

    if (vBin.size() > 0) {
        std::vector<unsigned char>::iterator it = vBin.end() - 1;
        while(it >= vBin.begin()) {
            strValue.append((*it == 1 ? "1" : "0"));
            if(it == vBin.begin())
                break;
            --it;
        }
    }

    if(bHighBitFillZero && (sizeof(T) * 8 > strValue.length()))
        strRet.append(sizeof(T)*8 - strValue.length() ,'0');
    strRet.append(strValue);

    return strRet;
}

2. 二进制字符串 转 十进制整数

代码如下:

#include <math.h>
#include <string>

long Bin2Dec(const std::string &strBin) {
    long lRet = 0;
    size_t iFisrt1 = strBin.find_first_of("1");
    if (iFisrt1 == std::string::npos) {
        return lRet;
    }

    size_t iLen = strBin.length();
    for (size_t i = iFisrt1; i < iLen; i++) {
        if (strBin[i] == '1') {
            lRet += (long)pow(2.f, (int)(iLen-i-1));
        }
    }

    return lRet;
}

3. 八进制、十进制、十六进制 互转

这几种进制的数据因为在代码中都有固定的表达方式(不像二进制数据没有约定一个表达方式,必须使用字符串的方式),如0x开头的为十六进制、0开头的为八进制、默认的为十进制。所以转换起来可以直接使用现成的API.

#include <stdio.h>

char szBuf[65] = {0};

// 十进制整数 --> 十六进制字符串
sprintf_s(szBuf, sizeof(szBuf), "%x", 100);

// 十进制整数 --> 八进制字符串
sprintf_s(szBuf, sizeof(szBuf), "%o", 100);

// 十六进制整数 --> 十进制字符串
sprintf_s(szBuf, sizeof(szBuf), "%d", 0x64);  // 十六进制以0x开头

// 八进制整数 --> 十进制字符串
sprintf_s(szBuf, sizeof(szBuf), "%d", 0144);  // 八进制以0开头

转载于:https://www.cnblogs.com/jiangxueqiao/p/7459285.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值