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


    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开头
    
  • 相关阅读:
    poj 1850/poj 1496
    poj 1035
    poj 3252
    hdoj 1013
    poj 2965
    poj 1844
    poj 2309
    蓝桥杯比赛回来后计划。。。
    山大实训第二周感想
    hadoop——Map/Reduce中combiner的使用
  • 原文地址:https://www.cnblogs.com/jiangxueqiao/p/7459285.html
Copyright © 2020-2023  润新知