C++將一個數值轉化爲二進制字符串

問題:如何將一個數值如0xfaceabcd轉化成二進制的字符串?

第一時間想到的是STLios

對了就是bitset對象
詳細見http://www.cplusplus.com/reference/bitset/bitset/?kw=bitset
windows

#include <iostream>
#include <bitset>
using namespace std;
int main()
{
	bitset<32> t(0xfaceabcd);
	cout<<"0x"<<hex<<t.to_ulong()<<"="<<t.to_string()<<"b"<<endl;
}
輸出:0xfaceabcd=11111010110011101010101111001101b

若是是在windows下要實現,ANSI下bitset是正常
可是UNICODE版
使用bitset對象就顯得力不從心
咋辦?咋辦?咋辦?
不如本身定義一個模板類來得快

#include <windows.h>
#include <tchar.h>
template <typename T>  
class XBIT
{
private:
	UINT 	m_size;//位數
	T 	m_value;//值
	TCHAR 	*m_szBuf;//二進制字符串,用new動態建立,destroy()中消除
public:
	XBIT(T value=0)
	{
		m_size=sizeof(T)*8;
		m_value=value;
		m_szBuf=new TCHAR[m_size+1];//+1 for NULL terminal
		to_string();
	}
	~XBIT()
	{
		destroy();
	}
	void destroy()
	{
		if( NULL!=m_szBuf )
		{
			delete[] m_szBuf;
			m_szBuf=NULL;
		}
	}
	T getvalue()
	{
		return m_value;
	}
	void setvalue(T value)
	{
		m_value=value;
		to_string();
	}
	TCHAR *getstr()
	{
		return m_szBuf;
	}
	TCHAR *to_string() 
	{
		memset(m_szBuf,'x',m_size+1);
		m_szBuf[m_size]=TEXT('\0');
		for(int n=m_size-1;n>=0;n--)//方法一
		{		
			TCHAR ch=(m_value>>n)&0x1 ?TEXT('1'):TEXT('0');
			m_szBuf[m_size-1-n]=ch;
		}
		//for(int n=0;n<m_size;n++)//方法二
		//{
		//TCHAR ch=( m_value>>(m_size-1-n) )&0x1 ?TEXT('1'):TEXT('0');
		//m_szBuf[n]=ch;	
		//printf("[d%02d]=%c\t",n,ch); 
		//}
		return m_szBuf;
	}	

};

下面是測試
測試

int _tmain()
{
 	XBIT<long> f(0xfaceabcd);
	_tprintf(_T("0x%x=%sb"),f.getvalue(),f.to_string());
}
結果
0xfaceabcd=11111010110011101010101111001101b
而後咱們在代碼最前面加入
#ifndef UNICODE
#define UNICODE
#endif
#ifndef _UNICODE
#define _UNICODE
#endif
測試UNICODE成功

改進版本
#ifndef UNICODE
#define UNICODE
#endif
#ifndef _UNICODE
#define _UNICODE
#endif

#include <windows.h>
#include <tchar.h>
	
template <typename T>  
class XBIT
{
private:
	UINT 	m_size;//位數
	T 		m_value;//值
	TCHAR 	*m_szBuf;//二進制字符串,用new動態建立,destroy()中消除
public:
	XBIT(T value=0)
	{
		m_size=sizeof(T)*8;
		m_value=value;
		m_szBuf=new TCHAR[m_size+1];//+1 for NULL terminal
		to_string();
	}
	~XBIT()
	{
		destroy();
	}
	T getvalue()
	{
		return m_value;
	}
	void setvalue(T value)//每次改變均調用私有參數to_string()
	{
		m_value=value;
		to_string();
	}
	TCHAR *getstring()
	{
		return m_szBuf;
	}
private:	
	void destroy()
	{
		if( NULL!=m_szBuf )
		{
			delete[] m_szBuf;
			m_szBuf=NULL;
		}
	}
	TCHAR *to_string() 
	{
		memset(m_szBuf,0,m_size+1);
		m_szBuf[m_size]=TEXT('\0');
		for(int n=m_size-1;n>=0;n--)//方法一
		{		
			TCHAR ch=(m_value>>n)&0x1 ?TEXT('1'):TEXT('0');
			m_szBuf[m_size-1-n]=ch;
		}
		//for(int n=0;n<m_size;n++)//方法二
		//{
		//TCHAR ch=( m_value>>(m_size-1-n) )&0x1 ?TEXT('1'):TEXT('0');
		//m_szBuf[n]=ch;	
		//printf("[d%02d]=%c\t",n,ch); 
		//}
		return m_szBuf;
	}	

};

int _tmain()
{
 	XBIT<unsigned long long> f(0xabcdef0123456789);
	_tprintf(_T("0x%x=%sb"),f.getvalue(),f.getstring());
}


而後彈出錯誤窗口



哪裏錯了?
tt.exe 中的 0x00402532 處未處理的異常: 0xC0000005: 讀取位置 0xabcdef01 時發生訪問衝突spa

原來是這個_tprintf(_T("0x%x=%sb"),f.getvalue(),f.getstring());code

看到了嗎
sizeof(unsigned long long) =8字節
原來%x格式化輸出也不是萬能的,咱們要把 %x 改爲 %I64x,或者 %llx對象


 _tprintf(_T("0x%I64x=%sb"),f.getvalue(),f.getstring());
或 
_tprintf(_T("0x%llx=%sb"),f.getvalue(),f.getstring());
輸出正常
0xabcdef0123456789=1010101111001101111011110000000100100011010001010110011110001001b字符串

相關文章
相關標籤/搜索