二进制、八进制、十进制、十六进制相互转换
2017-08-31 17:09
609 查看
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开头
相关文章推荐
- [JAVA]二进制,八进制,十六进制,十进制间进行相互转换
- 关于二进制,八进制,十进制,十六进制相互转换
- AS3中,二进制转成十进制和八进制、十六进制相互转换
- 十进制,八进制,十六进制,二进制相互转换大全
- 二进制、八进制、十进制、十六进制相互转换
- 二进制、八进制、十进制、十六进制之间的相互转换
- 在JAVA中二进制,八进制,十六进制,十进制间进行相互转换
- java 二进制,八进制,十进制,十六进制间相互转换的方法
- 二进制 八进制 十进制 十六进制的相互转换(精简总结)
- java中进行二进制,八进制,十六进制,十进制间进行相互转换
- java二进制、八进制、十进制、十六进制相互转换及位运算
- [JAVA]二进制,八进制,十六进制,十进制间进行相互转换
- java中进行二进制,八进制,十六进制,十进制间进行相互转换
- java 二进制,八进制,十六进制,十进制间进行相互转换
- [JAVA]二进制,八进制,十六进制,十进制间进行相互转换
- [JAVA]二进制,八进制,十六进制,十进制间进行相互转换
- Java 二进制,八进制,十进制,十六进制之间的相互转换
- [JAVA]二进制,八进制,十六进制,十进制间进行相互转换
- java中进行二进制,八进制,十六进制,十进制间进行相互转换
- 进制转换:二进制、八进制、十六进制、十进制相互转换