以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 \z>L,U
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 Yr9!</;T
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 5t&;>-A'?'
象当作char数组来处理。 Rr/sxR|0_
template<class Container> Fj~,>
class bit_iterator : public std::iterator<bidirectional_iterator_tag, W.t`
void, void> @z1Yj"^Pm
{ gu~F(Fb'
public: v*k}{M
explicit bit_iterator(Container& c) : m_container(&c) iw==q:$
{ /MUa
b*h
m_size = 8*sizeof(Container); MTxe5ob`$Q
m_index = 0; +Tug.[A
} g1TMyIUt[
explicit bit_iterator() : m_container(0) Xitsbf=Gg
{ G`1FD
m_size = 8*sizeof(Container); UX& ?^]
m_index = m_size; bzt(;>_8
} P5^<c\Mr,Y
bool operator* () C0$KpUB
{
*[^[!'kT&
char mask = 1; hLf<-NM
char* pc = (char*)m_container; 7P$>T
int i = (m_size-m_index-1)/8; xJ18M@"j
int off = (m_size-m_index-1)%8; i{
" g7
mask <<=off; :n} NQzs
return pc & mask; 2!+saf^-,
} W%bzA11l
bit_iterator<Container>& operator++() p#eai
{ B5iVT<:a
m_index++; ?i8a)!U
return *this; q fQg?Mr
}
1:+f@#
bit_iterator<Container>& operator++(int) R!8 qkG
{ / .ddx<
m_index++; !C$bOhc
return *this; E 9LKVs}
} D[5Qd)PIL
bool operator==(bit_iterator<Container>& bitIt) wgb
e7-{
{ a*4l!-7
return m_index == bitIt.m_index; 2MapB*
} n%J{Tcn6
bool operator!=(bit_iterator<Container>& bitIt) bm+
#OI
{ E0Y>2HOuL
return !(*this == bitIt); xy$agt>j>
} Ki DL]2
protected: XpLK0YI
Container* m_container; r#xq 8H=_m
private: T3W?-,
int m_size; Jbrjt/OG#I
int m_index; \<bar ~
}; cn~M:LW23
)_\ZUem
用该迭代器可以将任意类型对象以二进制格式输出: 6ofi8(n[
double a = 10; @FBlF$vG
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));