以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 3?E}t*/
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 S>f&6ZDNY(
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 Gr)-5qh
象当作char数组来处理。 36$[
template<class Container> %l$W*.j|;
class bit_iterator : public std::iterator<bidirectional_iterator_tag, {a"RXa
void, void> P(ZQDTbM
:
{ PC/!9s0W
public: VKrShI
explicit bit_iterator(Container& c) : m_container(&c)
=r6qX
{ rC }}r!!
m_size = 8*sizeof(Container); rVzI_zYqp'
m_index = 0; ]WL|~mG
} LWmB,
Zf/
explicit bit_iterator() : m_container(0) wE Qi0!
{ fx?$9(r,
m_size = 8*sizeof(Container); G{lcYP O
m_index = m_size; #`ejU &!6
} J^zi2jtV
bool operator* () ijW7c+yd
{ *g$i5!yM'
char mask = 1; dM]#WBOPy
char* pc = (char*)m_container; IeTdN_8
int i = (m_size-m_index-1)/8; Ly #_?\bn
int off = (m_size-m_index-1)%8; GozPvR^/
mask <<=off; 7%d8D>uw8
return pc & mask; y4jU{,
} <z0WLw0'z
bit_iterator<Container>& operator++() Q5n`F5
{ (Hp' B))2
m_index++; I/uy>*
return *this; GP,<`l&
} @;)PSp*j
bit_iterator<Container>& operator++(int) 1}g:|Q
{ ~5OL6Bi-q
m_index++; UA-7nb
return *this; K*vU5S
} A
Y9
9!p
bool operator==(bit_iterator<Container>& bitIt) o0I9M?lP
{ ;Icixu'O
return m_index == bitIt.m_index; T|) {<
} 74J@F2g}?
bool operator!=(bit_iterator<Container>& bitIt) gv.6h{Ut
{ zx%X~U
return !(*this == bitIt); \3zj18(@8!
} ^mPPyT ,(
protected: |:[9O`U)s
Container* m_container; #&Is GyU
private: [EZYsOr.
int m_size; $g\&5sstE
int m_index; )D@~|j:
}; Fo|xzLm9*|
GjT#%GBF
用该迭代器可以将任意类型对象以二进制格式输出: kfrY1
double a = 10; uzU{z;
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));