以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 :\4O9f*5+
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 y{j>4g$:z
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 RK rBHqh@
象当作char数组来处理。 p-*BB_J"
template<class Container> *
+OAc`8
class bit_iterator : public std::iterator<bidirectional_iterator_tag, .*Hv^_
void, void> F6%rH$aS
{ 8$G$Rdn
public: ^f<f&V
explicit bit_iterator(Container& c) : m_container(&c) DU 8)c$
{ ^+GN8LUs
m_size = 8*sizeof(Container); L {B#x@9tQ
m_index = 0; nF=Ig-NX^
}
K[?wP>s
explicit bit_iterator() : m_container(0) kQ'G+Kw~F
{ :-6_X<
m_size = 8*sizeof(Container); e;!<3b
m_index = m_size; u{H_q&1
} 8\I(a]kM`
bool operator* () <78>6u/W%
{ IloHU6h'
char mask = 1; VKR6 i
char* pc = (char*)m_container; 0hNc#x6
int i = (m_size-m_index-1)/8; pn
=S%Qf]
int off = (m_size-m_index-1)%8; ait/|a
mask <<=off; GbL,k?ey
return pc & mask; pbgCcO~xm
} O]~p)E
bit_iterator<Container>& operator++() }'@*Ol j
{ ]h|GaHiE
m_index++;
Pt1Htt:BE
return *this; ;- cq#8S
} `mWg$e,
bit_iterator<Container>& operator++(int) 9]7^/g*!
{ A$5!]+
m_index++; -7pZRnv
return *this; l[.pI];T
} !MGQ+bD6
bool operator==(bit_iterator<Container>& bitIt) Y.}n ,y|J}
{ "arbUX~d
return m_index == bitIt.m_index; gqC:r,a
} Gm6^BYCk
bool operator!=(bit_iterator<Container>& bitIt) ,$*IJeKx
{ wiFckF/
return !(*this == bitIt); z!F?#L5
} t;4{l`dk
protected: `[:f;2(@
Container* m_container;
Ng-3|N
private: ]0O pd9
int m_size; /Wj9Stj5
int m_index; G4=v2_]
}; 9^aMmN&6N2
:_?>3c}L
用该迭代器可以将任意类型对象以二进制格式输出: GJ((eAS)
double a = 10; +Uk/Zg
w^
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));