以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 <o= 8FO
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 -GgA&dh
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 9M9?%N:ra
象当作char数组来处理。 ]cN1c}
template<class Container> 5^KWCS7@
class bit_iterator : public std::iterator<bidirectional_iterator_tag, OC:T
O|S:4
void, void> 3Hm/(C
{ 7`YEH2
public: lPJ\-/>$z
explicit bit_iterator(Container& c) : m_container(&c) l$'wD hN*
{ EyLu O-5
m_size = 8*sizeof(Container); FEVlZ<PW3I
m_index = 0; Wr5V`sM
} {>%&(
explicit bit_iterator() : m_container(0) ~WN:DXn
{ Ydy9
m_size = 8*sizeof(Container); W,-g=6,
m_index = m_size; xp9pl[l
} yH}s<@y;7
bool operator* () LraWcO\or'
{ 0C*7K?/
char mask = 1;
EU/8=JA1
char* pc = (char*)m_container; kM@zyDn,
int i = (m_size-m_index-1)/8; zA"`!}*
int off = (m_size-m_index-1)%8; S@ f9c
mask <<=off; {vO9ptR;
return pc & mask; RAK-UN
} {
buy"X4
bit_iterator<Container>& operator++() +&"zU GTIc
{ }-3mPy(*%
m_index++; Uv~QUL3>
return *this; |B2+{@R
} ~| 6[j<ziL
bit_iterator<Container>& operator++(int) K}U-w:{
{ dw7$Vh0y
m_index++; ~F?u)~QZ#
return *this; hDq`Z$_+KX
} =iD3Yt
bool operator==(bit_iterator<Container>& bitIt) 13=.H5
{ ^w06<m
return m_index == bitIt.m_index; :<#nTh_@\'
} B !=F2
bool operator!=(bit_iterator<Container>& bitIt) uc"P3,M
{ E`k@{*Hn&
return !(*this == bitIt); qWKAM@
} ]P2"[y
protected: $"&{aa
Container* m_container; BFJnV.0M!
private: [R7Y}k:9U
int m_size; s&!a
int m_index; '-/xyAzS
}; -8rjgB~."/
aCLq k'
用该迭代器可以将任意类型对象以二进制格式输出: mju>>\9
double a = 10; Nl(3Xqov
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));