以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 q*Oj5;
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 ;m7~!m)
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ,)uW`7
象当作char数组来处理。 g:O/~L0Xb
template<class Container> r$v\ \^?2
class bit_iterator : public std::iterator<bidirectional_iterator_tag, Wks zNh
void, void> ]x).C[^
{ ce;$)Ff\
public: ^OV!Q\j.q
explicit bit_iterator(Container& c) : m_container(&c) lN&+<>a
{ >z~_s6#CP
m_size = 8*sizeof(Container); ` ZZ3!$czR
m_index = 0; ,SPgop'
} }3,
4B-8!
explicit bit_iterator() : m_container(0) S\]9mHJI
{ .820~b0
m_size = 8*sizeof(Container); tU$n3Bg
m_index = m_size; *<:6A&'D9
} /0cm7[a ?
bool operator* () <)pPq+
{ pP#D*hiP-g
char mask = 1; /Xj{]i3{
char* pc = (char*)m_container; k( Ik+=u
int i = (m_size-m_index-1)/8; h oO847
int off = (m_size-m_index-1)%8; Ml9m#c
mask <<=off; kL8E#
return pc & mask; q{Gh5zg5O
} '%ByFZzi
bit_iterator<Container>& operator++() +1I7K|M
{ "Bv V89
m_index++; :IU<A G6
return *this; Z
t4q=
Lr
} B uso
`G
bit_iterator<Container>& operator++(int) =E$bZe8
{ A9g/At_
m_index++; 33KCO
return *this; TV0sxod6
} JhjH_)
bool operator==(bit_iterator<Container>& bitIt) b)x0;8<
{ iITMBS`}
return m_index == bitIt.m_index; :Jf</uP_
} m,"-/)
bool operator!=(bit_iterator<Container>& bitIt) }D+ b`,
{ s?s,wdp
return !(*this == bitIt); $9j>oUG
} BW6Ox=sr<
protected: ?(U;T!n
Container* m_container; JU;`c>8=)
private: n!AW9]
int m_size; p^}`^>OL
int m_index; $a8,C\me?
}; Tt9cX}&&
k q]E@tE*3
用该迭代器可以将任意类型对象以二进制格式输出: {]U
\HE1w
double a = 10; GqNOWK2O
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));