以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 u HXb=U
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 q[+V6n`Z5
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 BA_l*h%=Cc
象当作char数组来处理。 BF
U#FE)s
template<class Container> a2H_8iQ!
class bit_iterator : public std::iterator<bidirectional_iterator_tag, N~B'gJJDx
void, void> %j ?7O00@
{ uQkQ#'e|
public: @4jPaqa(
explicit bit_iterator(Container& c) : m_container(&c) #e6x_o|
{ E9j(%kQ2
m_size = 8*sizeof(Container); g'V,K\TG
m_index = 0; l%7^'nDn
} < !]7Gt
explicit bit_iterator() : m_container(0) KQ.cd]6
{ NjSjE_S2B8
m_size = 8*sizeof(Container); (rSBzM]H
m_index = m_size; jce2lXMm
} |R (rb-v
bool operator* () ]j<&
:_
{ `Dv&.
char mask = 1; KT8]/T`U
char* pc = (char*)m_container; }Yp]A
int i = (m_size-m_index-1)/8; 2graLJ?9Z
int off = (m_size-m_index-1)%8; <(caY37o6)
mask <<=off; 8 9f{8B]z
return pc & mask; x<{)xP+|
} xsXf_gGu
bit_iterator<Container>& operator++() >HQ<KFA
{ F%
K}&3
m_index++; 5[$jrG\!
return *this; MIwkFI8
} u<
.N\/
bit_iterator<Container>& operator++(int) 8BwJWxBQ
{ PQ[x A*
m_index++; A+F@JpV
return *this; 6B>H75S+H
} 8p~G)J3U
bool operator==(bit_iterator<Container>& bitIt) QOY M/1U
{ x$aFJCL
return m_index == bitIt.m_index; a,*~wmg
} 5R7DD 5c[
bool operator!=(bit_iterator<Container>& bitIt) w
B[H&
{ o9uir"=
return !(*this == bitIt); `=cOTn52
} F^|4nBd*ub
protected: Fr ryZe=
Container* m_container; U49
`!~b7
private: tB7g.)yZb
int m_size; seo.1.Da2
int m_index; 'w5g s}1D
}; ,,[pc
+=A53V[C
用该迭代器可以将任意类型对象以二进制格式输出: ^J Y]w^u
double a = 10; ",qJG]_ <
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));