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

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开头
posted @ 2017-08-31 17:09  jiangxueqiao  阅读(1267)  评论(1编辑  收藏  举报