以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 boh?Xt-$
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 #;!&8iH
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 }`"`VLh
象当作char数组来处理。 1^iBS
template<class Container> 8HF^^Cva
class bit_iterator : public std::iterator<bidirectional_iterator_tag, xU
*:a[g
void, void> ! -gU~0
{ IThd\#=
public: k[=qx{Osx%
explicit bit_iterator(Container& c) : m_container(&c) >}5?`.K~Q*
{ s-i|P
m_size = 8*sizeof(Container); xad`-vw
m_index = 0; yPyu)
} NnZW@ln"|
explicit bit_iterator() : m_container(0) t [QD#;
{ ${Z0@G+
m_size = 8*sizeof(Container); Xtp8^4Va
m_index = m_size; 1uF$$E6[
} 8h)XULs2
bool operator* () 2*Z2uV^
{ 8*ZsR)!
char mask = 1; rIb+c=|F
char* pc = (char*)m_container; Vej$|nF
int i = (m_size-m_index-1)/8; QFh1sb)]d)
int off = (m_size-m_index-1)%8; O*yxOb*
mask <<=off; _z5/&tm_H
return pc & mask; q5'S<qY^
} `-NK:;^
bit_iterator<Container>& operator++() GW2\YU^{
{ yMs!6c*
m_index++; P
rt}
01$
return *this; Sb.8d]DW
} :t?B)
bit_iterator<Container>& operator++(int) }r}*=;Ea
{ ZWs
m_index++; V35Vi6*p
return *this; |dRVSVN
} 3"fDFR
bool operator==(bit_iterator<Container>& bitIt) A_9WSXR
{ k.T=&0J_1
return m_index == bitIt.m_index; 7Z-j'pq
} Z%T Ajm
bool operator!=(bit_iterator<Container>& bitIt) g40Hj Y
{ OATdmHW
return !(*this == bitIt); Uj@th
} _=v#"l
protected: +z
>)'#
Container* m_container; ?H{[u rLn
private: )0{`}7X
int m_size; QV4|f[Ki%
int m_index; m0HK1'
}; .hTqZvDa
Q=~"xB8
用该迭代器可以将任意类型对象以二进制格式输出: PK*Wu<<
double a = 10; \0$+*ejz
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));