以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 VXwPdMy*L
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 /K@$#x_{
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 .yX>.>"T|
象当作char数组来处理。 |AC6sfA+
template<class Container> `.[ 8$
class bit_iterator : public std::iterator<bidirectional_iterator_tag, P.h.MA]
void, void> Wy.";/C
{ rd"
&QB{
public: @701S(0'7
explicit bit_iterator(Container& c) : m_container(&c) {"jd_b&
{ pqH4w(;
m_size = 8*sizeof(Container); FQ!Oxlq,Q
m_index = 0; c|Y!c!9F
} R^6Zafp
explicit bit_iterator() : m_container(0) Mi?}S6bp
{ fnWsm4
m_size = 8*sizeof(Container); S/fW/W*/}
m_index = m_size; CL1
oAk
} MJ\r 4n
bool operator* () +sRP<as
{ `s%QeAde
char mask = 1; .it2NS
char* pc = (char*)m_container; 'in@9XO
int i = (m_size-m_index-1)/8; kW+G1|
int off = (m_size-m_index-1)%8; ;_N"Fdl
mask <<=off; :3 y_mf>
return pc & mask; ?@DNsVwb
} nj
bit_iterator<Container>& operator++() oq. r\r
{ ??(Kwtx{
m_index++; qv uxhz F
return *this; '?8Tx&}U8
} # 66e@
bit_iterator<Container>& operator++(int) 2( _=SfQ
{ -njQc:4W,-
m_index++; YZ**;"<G
return *this; u7#z^r
} )
$#(ZL^m
bool operator==(bit_iterator<Container>& bitIt) N Bz%(?\
{ GI_DhU]~)
return m_index == bitIt.m_index; Pin/qp&Fa8
} "{ FoA3g|
bool operator!=(bit_iterator<Container>& bitIt) yd*3)6=
{ cgN>3cE
return !(*this == bitIt); auL^%M|$R
} aq kix"J
protected: K:_($X]
Container* m_container; {R8=}Qo
private: [e1L{ _*l
int m_size; ^yJ:+m;6K
int m_index; vI|As+`$d
}; Hk9U&j$
T>F9Hs W
用该迭代器可以将任意类型对象以二进制格式输出: /WYh[XKe
double a = 10; dhtb?n{
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));