以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 {V:?r
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 '3|OgV
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 E%+V\ W%
象当作char数组来处理。 `[Lap=.'.
template<class Container> -4X,x
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Sgr<z d'b
void, void> &Vl,x/
{ y
?Q"-o (
public: rytizbc
explicit bit_iterator(Container& c) : m_container(&c) )(?s=<H
{ xG<S2R2VQh
m_size = 8*sizeof(Container); S;*,V|#QD
m_index = 0; }V9146
} kv) LH{
explicit bit_iterator() : m_container(0) S, Oy}Nv
{
)5]z[sE
m_size = 8*sizeof(Container); I,?bZ&@8
m_index = m_size; }eB\k,7L
} i?|K+"=D
bool operator* () :B"'49Q`
{ Cr(pN[,
char mask = 1; AV%Q5Mi}
char* pc = (char*)m_container; !nykq}kPN\
int i = (m_size-m_index-1)/8; Gt- -7S
int off = (m_size-m_index-1)%8; 9:@os0^O
mask <<=off; |5g*pXu{
return pc & mask; I]
} Kji}2j'a
bit_iterator<Container>& operator++() zJ &qR
{ +R*4`F:QJQ
m_index++; j*+r`CX
return *this; r$0=b
-
} TTqOAo[-Z
bit_iterator<Container>& operator++(int) E\'_`L
{ xaSkn
m_index++; $H5PB' b
return *this; `D#l(gZ
} 6"%[s@C
bool operator==(bit_iterator<Container>& bitIt) e {c.4'q
{ ?g<*1N?:
return m_index == bitIt.m_index; o AQ92~b
} 2%WZ-l!i
bool operator!=(bit_iterator<Container>& bitIt) eKu&_q
{ iUl{_vb
return !(*this == bitIt); XFBk:~}sI
} -'YX2!IU,
protected: crvWAsm
Container* m_container; s
fti[
private: c#G(7. 0MU
int m_size; %\-+SeC
int m_index; ]enqkiS
}; !!` zz
2$3BluK
用该迭代器可以将任意类型对象以二进制格式输出: Mzb_o2^(
double a = 10; O;,k~
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));