以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 0C3Y =F
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 s'd\"WaQV
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 qG2P?D R
象当作char数组来处理。 fGW~xul_
template<class Container> &_s^C?x
class bit_iterator : public std::iterator<bidirectional_iterator_tag, WRRR "Q$
void, void> .g7\+aiTUd
{ z_#HJ}R=
public: KNN$+[_;H4
explicit bit_iterator(Container& c) : m_container(&c) ILiOEwHS7F
{ 4/_!F'j
m_size = 8*sizeof(Container); [g}0.J`_
m_index = 0; Nx+5r p
} i7rk%q
explicit bit_iterator() : m_container(0) a1ps'^Qhh
{ #s#BYbF
m_size = 8*sizeof(Container); ?%lfbZ
m_index = m_size; ,1.Td=lY$
} Q
\SSv;3_
bool operator* () '*Tt$0#o
{ _;/+8=
char mask = 1; ]GsI|se
char* pc = (char*)m_container; eht>4)
int i = (m_size-m_index-1)/8; rmFcSolt,f
int off = (m_size-m_index-1)%8; 7AqbfLO
mask <<=off; T-iQ!D~
return pc & mask; RE-y5.kE^
} T1 1>&K)
bit_iterator<Container>& operator++() '#oH1$W]
{ )nq(XM7
m_index++; hBifn\dFr
return *this; s$lJJL
} ``@e7~F{
bit_iterator<Container>& operator++(int) yMmUOIxk\
{ (/9 erfuJ
m_index++; _EP~PW#J
return *this; k9NHdi7&2
} |Ho}
D~
bool operator==(bit_iterator<Container>& bitIt) [@3.dd
{ Uc
; S@
return m_index == bitIt.m_index; ixoN#'y<"
} T-x9IoE
bool operator!=(bit_iterator<Container>& bitIt) aZ|S$-}
{ L$"pk{'
return !(*this == bitIt); 3Tc90p l*t
} 83aWMmA(1
protected: Y:Jgr&*,z
Container* m_container; <^W5UU#Pg
private: A6E~GJa
int m_size; H|MAbx
7
int m_index; _Kh8
<$h
}; v-"nyy-&Z
r
Cz,XYV
用该迭代器可以将任意类型对象以二进制格式输出: >7cDfv"
double a = 10; {d)L0KXK
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));