以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 m^ILcp!
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 <"t >!I
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 {U4%aoBd8
象当作char数组来处理。 "e(Nh%t
template<class Container> 0uZH H
class bit_iterator : public std::iterator<bidirectional_iterator_tag, !6kLg1
void, void> EZ$m4:{e
{ <@?bYp
public: 4Fnr8 r8W
explicit bit_iterator(Container& c) : m_container(&c) 8U-}%D<a
{ L:S[QwQu8
m_size = 8*sizeof(Container); /JvNJ
f
m_index = 0; 'a0$74f z
} LTi0,03l<
explicit bit_iterator() : m_container(0) Oh|Hy/&6W
{ ~O<Bs{8
m_size = 8*sizeof(Container); 8&3G|m1-2
m_index = m_size; gn'. 9";j
} S3 &L
bool operator* () (_d^iZyf
{ [1N*mY;
char mask = 1; fSSDOH!U,
char* pc = (char*)m_container; chxO*G
int i = (m_size-m_index-1)/8; HQ]g{JVld\
int off = (m_size-m_index-1)%8; lwa
mask <<=off; R7vO,kZ6Q
return pc & mask; GUMO;rZs
} JD,/oL.KA
bit_iterator<Container>& operator++() 8)T.[AP
{ +}%4]O;
m_index++; './s'!Lj
return *this; "/wZt c
} edA.Va|0
bit_iterator<Container>& operator++(int) X+iUT
{ iEnDS@7
m_index++; @'dtlY5;
return *this; ?&"-y)FG
} b1_HDC(
bool operator==(bit_iterator<Container>& bitIt) O9jqeF`L=
{ {8'I+-
return m_index == bitIt.m_index; 06L/i,
} IE,xiV
bool operator!=(bit_iterator<Container>& bitIt) 81`-xVd
{ @=:( b"Sg
return !(*this == bitIt); Ub0g{
} 1^$ vmULj
protected: {4\(HrGNk
Container* m_container; kbiMqiPG
private: BlMc<k
int m_size; P6@(nGgK<
int m_index; Q`'w)aV
}; UhXZ^k3
qE!.C}L+
用该迭代器可以将任意类型对象以二进制格式输出: 0escp~\Z
double a = 10; .gzNdSE
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));