問題:如何將一個數值如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
#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()); }結果
#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字符串