以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 0jWVp-y
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 2y1Sne=<Kb
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 SUK?z!f<i
象当作char数组来处理。 lPAQ3t!,
template<class Container> SSzIih@u
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ,|/f`Pl
void, void> X2'0PXv>!
{ &mM0AA'\?H
public: ti,d&c_7
explicit bit_iterator(Container& c) : m_container(&c) Q\0'lQJdy
{ E' uZA
m_size = 8*sizeof(Container); ;}p
m_index = 0; kD"{g#c
} n~Lt\K:
explicit bit_iterator() : m_container(0) ]T) 'Hb
{ _DEjF)S
m_size = 8*sizeof(Container); [()koU#w.
m_index = m_size; 7F.4Ga;
} [mueZQyI?0
bool operator* () YuwI&)l
{ |;{6&S
char mask = 1; 7_[L o4_
char* pc = (char*)m_container; cso8xq|b7
int i = (m_size-m_index-1)/8; tfWS)y7
int off = (m_size-m_index-1)%8; %\:Wi#w>
mask <<=off; .x&%HA
return pc & mask; MLp9y#
} 8H`[*|{'
bit_iterator<Container>& operator++() ]hV*r@d
{ <%mRSv
m_index++; 9;If&uM
return *this; uhq8
} ,<X9 Y2B
bit_iterator<Container>& operator++(int) 9:lFo=
{ -trkA'ewZ
m_index++; F((4U"
return *this; _)iCa3z
} /BL4<T f
bool operator==(bit_iterator<Container>& bitIt) tX~w{|k
{ /dIzY0<aO
return m_index == bitIt.m_index; dDGQ`+H9
} 1=v*O.XW`
bool operator!=(bit_iterator<Container>& bitIt) K:WDl;8(d
{ 62NsJ<#>
return !(*this == bitIt); b#o|6HkW
} I]_5}[I
protected: :rP=t ,
Container* m_container; asqV~n
private: 9A#i_#[R
int m_size; iN.n8MN=I
int m_index; $<OD31T
}; tQ601H>o
HK%7g
用该迭代器可以将任意类型对象以二进制格式输出: Pc]HP
double a = 10; y<.5xq5_3
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));