zoukankan      html  css  js  c++  java
  • 二进制、八进制、十进制、十六进制相互转换

    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开头
    
  • 相关阅读:
    面向对象的继承关系体现在数据结构上时,如何表示
    codeforces 584C Marina and Vasya
    codeforces 602A Two Bases
    LA 4329 PingPong
    codeforces 584B Kolya and Tanya
    codeforces 584A Olesya and Rodion
    codeforces 583B Robot's Task
    codeforces 583A Asphalting Roads
    codeforces 581C Developing Skills
    codeforces 581A Vasya the Hipster
  • 原文地址:https://www.cnblogs.com/jiangxueqiao/p/7459285.html
Copyright © 2011-2022 走看看