以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 X~o6Xkg
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 >QA;02
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ]-2Q0wTj
象当作char数组来处理。 ukInS:7
template<class Container> #a$k3C
class bit_iterator : public std::iterator<bidirectional_iterator_tag, lx)Bj6
void, void> Q
1:7 9
{ F5+)=P#
public: (q
0wV3Qv
explicit bit_iterator(Container& c) : m_container(&c) rBLcj;,
{ 4.t72*ML
m_size = 8*sizeof(Container); R= co2 5
m_index = 0; LBw$K0
} }w|a^=HAp
explicit bit_iterator() : m_container(0) ;WP%)Z
{ ~BbF:DS
m_size = 8*sizeof(Container); 5ltrr(MeD
m_index = m_size; |Nf90.dL
} XwlF[3VbiX
bool operator* () UG,<\k&
{ k^i\<@v
char mask = 1; >"/Sa_w
char* pc = (char*)m_container; YD@n8?~$$
int i = (m_size-m_index-1)/8; "3Lq/mJYnZ
int off = (m_size-m_index-1)%8; QIWfGVc-
mask <<=off; n#dvBK0M
return pc & mask; {Y6;/".DM
} nX>HRdC
bit_iterator<Container>& operator++() u]$e@Vw.
{
!\hUjM+(}
m_index++; bMvHAtp
return *this; 1:j[p=Q&
} #*zl;h1(
bit_iterator<Container>& operator++(int) >S[NI<=8S
{ 7,IH7l|G
m_index++; C?h}n4\B^?
return *this; aBblP8)8;K
} 7O]$2
bool operator==(bit_iterator<Container>& bitIt) 0Q)m>oL.
{
IPDQ
return m_index == bitIt.m_index; qi]"`\
} Ty5}5)CRZ
bool operator!=(bit_iterator<Container>& bitIt) vdFP ^06
{ Q^@z]Sc[
return !(*this == bitIt); wticA#mb
} >&?k^nI}J
protected: [IRWm N-
Container* m_container; ^)%TQ.
private: 6xT"j)h
int m_size; 3qVDHDQ?ZV
int m_index; wyC1M
}; ?rSm6V
6)#=@i`
\
用该迭代器可以将任意类型对象以二进制格式输出: [6}>?
double a = 10; DRy,n)U&
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));