以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 _]?Dt%MkD
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 v,!Y=8~9
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 g.`t!6Hc
象当作char数组来处理。 Ei?9M^w
template<class Container> ^*?B)D =,
class bit_iterator : public std::iterator<bidirectional_iterator_tag, wE8a4.
void, void> /F8\%l+
{ xJF6l!`
public: W:+2We @
explicit bit_iterator(Container& c) : m_container(&c) oX:1 qJrC
{ ZimMjZ%4
m_size = 8*sizeof(Container); 13>3R+o
m_index = 0; e2Kpx8kWj
} (&Tb,H)=
explicit bit_iterator() : m_container(0) :zn ?<(sQ
{ xJH9qc ME
m_size = 8*sizeof(Container); -Y jv&5
m_index = m_size; !+|N<`
} mb*h73{{
bool operator* () K+\0}qn
{ K^cWj_a"
char mask = 1; EfrkB"
char* pc = (char*)m_container; Pguyf2/w
int i = (m_size-m_index-1)/8; ixJ20A7
int off = (m_size-m_index-1)%8; +v[$lh+
mask <<=off; Oz9Mqcx
return pc & mask; Y4~wNs6
} !>kv.`|7~
bit_iterator<Container>& operator++() Zh~Lm
{ zQ6
-2 A
m_index++; Y5A~iGp8E
return *this; VqO<+~M,E
} A*26'
bit_iterator<Container>& operator++(int) GZhfA ;O,
{ d;jJe0pH
m_index++; zhvk%Y:
return *this; TLL[F;uZ
} 6t mNfI34
bool operator==(bit_iterator<Container>& bitIt) Eztz~oFo
{ E_gDwWot
return m_index == bitIt.m_index; LN3dp?;_{
} 8yo6v3JqC
bool operator!=(bit_iterator<Container>& bitIt) +q_lYGTiO
{ A@
return !(*this == bitIt); WJh;p: q[
} Ag-?6v
protected: cmGj0YUQ1
Container* m_container; + x;ML
private: }$k`[ivBx(
int m_size; eze(>0\f
int m_index; fe9& V2Uu
}; luz%FY:
[|;Zxb:
用该迭代器可以将任意类型对象以二进制格式输出: f$S
QhK5`
double a = 10; +8vzkfr3It
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));