以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 klf<=V
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ik$wS#1+L
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 $,aU"'D
象当作char数组来处理。 =R>Sxaq
template<class Container> yQi|^X~?$
class bit_iterator : public std::iterator<bidirectional_iterator_tag, p1?}"bHk
void, void> =rBFMTllM
{ 7Ck;LF}>0
public: =\XAD+
explicit bit_iterator(Container& c) : m_container(&c) 'oT}jI
{ d:pp,N~2o
m_size = 8*sizeof(Container); h.?[1hT4R
m_index = 0; "L8V!M_e
} zl:
u@!'
explicit bit_iterator() : m_container(0) \Flq8S /t^
{ (VO Ka
m_size = 8*sizeof(Container); k oHY
AF
m_index = m_size; 8fe"#^"s R
} g u|;C
bool operator* () _O!D*=I
{ "^XN"SUw
char mask = 1; Q}=RG//0*
char* pc = (char*)m_container; 3Aj_,&X.@(
int i = (m_size-m_index-1)/8; Ro<!n>H
int off = (m_size-m_index-1)%8; eGTK^p
mask <<=off; 8PEOi
return pc & mask; gr fF\_[:
} .R
gfP'M
bit_iterator<Container>& operator++() gZ+I(o{
{ %ly;2HIk
m_index++; i;xg[e8.
return *this; Nl_;l
} j}VOr >xz
bit_iterator<Container>& operator++(int) |wLQ)y*
{ cbwzT0
m_index++; *$cp"
return *this; xc/|#TC8?
} <GNOT"z
bool operator==(bit_iterator<Container>& bitIt) l?R_wu,Q
{ ^&6NB)6
return m_index == bitIt.m_index; eAuJ}U[
} (C3d<a\:
bool operator!=(bit_iterator<Container>& bitIt) (Dl"s`UH~
{ bv+e'$U3
return !(*this == bitIt); @ [FFYVru
} UpIf t=@P
protected: u}:O[DG
Container* m_container; Tb)x8-0
private: {30<Vc=
int m_size; CYn}wkz
int m_index; p|FX_4RjX
}; O#EBR<CuK
ZGbZu
用该迭代器可以将任意类型对象以二进制格式输出: %om7h$D=`
double a = 10; E1C8yIF
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));