以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 N5KEa]k1nw
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 y;:]F|%<
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 A;T[['
象当作char数组来处理。 ob]dZ
template<class Container> B52H(sm
class bit_iterator : public std::iterator<bidirectional_iterator_tag, "uhV|Lk*7
void, void> 97 S? ;T
{ jN {Zw*
public: x ;mJvfX
explicit bit_iterator(Container& c) : m_container(&c) !EM#m@kZ{
{ KGQC't
m_size = 8*sizeof(Container); oXbI5XY)wb
m_index = 0; C
Oa.xyp
} $`v+4]
explicit bit_iterator() : m_container(0) z^3Q.4Qc6^
{ N33AcV!*8
m_size = 8*sizeof(Container); 6WO7+M;z
m_index = m_size; 6}STp_x
} E\iJP^n
bool operator* () ]< +3Vw
{ `I{ tZ$iD
char mask = 1; Ge0Lb+<G
char* pc = (char*)m_container; 9#fp_G;=
int i = (m_size-m_index-1)/8; dr{1CP
int off = (m_size-m_index-1)%8; itHM7d
mask <<=off; SXh?U,5u
return pc & mask; AI~9m-,mE
} %i3{TL
bit_iterator<Container>& operator++() ?DRR+n _
{ c(E,&{+E
m_index++; |mvM@V;^8{
return *this; `{<JC{yc?
} D!/0c]"
bit_iterator<Container>& operator++(int) E9L!)D]Y
{ AygvJeM_W
m_index++;
aH
return *this; ^ `je
} ]$|st^Q
bool operator==(bit_iterator<Container>& bitIt) 1xIFvXru
{ D Kq-C%
return m_index == bitIt.m_index; DUhT>,~]
} =oPng=:
bool operator!=(bit_iterator<Container>& bitIt) La]4/=a
{ $Ba`VGP>)3
return !(*this == bitIt); A-;^~I
} lU&Q^Zj`
protected: 0H<4+
*`K
Container* m_container; {>A
8g({i
private: t%:G|n Sz
int m_size; ,uO?;!t
int m_index; g*28L[Q~
}; UFL0 K
OFQ{9
用该迭代器可以将任意类型对象以二进制格式输出: juXC?2c
double a = 10; #]igB9Cf)w
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));