以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 M R'o{?{e`
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 Y7U&Q:5'
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 Qu%D
象当作char数组来处理。 !q4x~G0d
template<class Container> Q;h3v1GC\P
class bit_iterator : public std::iterator<bidirectional_iterator_tag, W W "i
void, void> b
X)|MiWI
{ Psa@@'w
public: U!e6FHj7
explicit bit_iterator(Container& c) : m_container(&c) -NM0LTF
{ R9r+kj_
m_size = 8*sizeof(Container); UP2.]B!d
m_index = 0; 6ri#Lw
} !rTmR@e$/
explicit bit_iterator() : m_container(0) =qoRS0Qa
{ _$/
+D:K
m_size = 8*sizeof(Container); R[A5JQ$[
m_index = m_size; *j*Du+
} b>cafu
bool operator* () H3 m8
{ *M~.3$NN
char mask = 1; $V8vrT#:
char* pc = (char*)m_container; *,#q'!Hq
int i = (m_size-m_index-1)/8; zp=!8Av
int off = (m_size-m_index-1)%8; 5M?mYNQR/H
mask <<=off; K6pw8
return pc & mask; "D> ]ES%5
} M%=P)cC
bit_iterator<Container>& operator++() 3n(*E_n
{ pZ+j[!
m_index++; aqQ o,5U>
return *this; aIGn9:\
} d><fu]'
bit_iterator<Container>& operator++(int) rveVCTbC
{ eihZp
m_index++; Hbr^vYs5
return *this; r7XD&Y
} :|XCnK0
bool operator==(bit_iterator<Container>& bitIt) 5~\Kj#PBx
{ d 7i#w
#
return m_index == bitIt.m_index; aG3k4
} 1=TSJ2{9
bool operator!=(bit_iterator<Container>& bitIt) \JU ~k5j
{ Ff/Ig]Lb
return !(*this == bitIt); \|{*arS
} :c;_a-69
protected: u[`v&e
Container* m_container; lS{4dvr?w
private: Qg>L,ZO
int m_size; Fg@ ACv'@
int m_index; 0}-#b7eR
}; UT-ewXh
Dh8(HiXf:
用该迭代器可以将任意类型对象以二进制格式输出: >40
GP#Vz
double a = 10; 2E$i_jc
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));