二进制、八进制、十进制、十六进制相互转换
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开头