以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 "=!sZO?3
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 m.ejGm?
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 a]@BS6
象当作char数组来处理。 oa6&?4K?F
template<class Container> _:HQ4s@
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 6xoCB/]
void, void> 'Xu3]'m*
{ s^HI%mdf
public: 0ni/!}YP_
explicit bit_iterator(Container& c) : m_container(&c) KN".0WU
{ 0X}0,
m_size = 8*sizeof(Container); t(p}0}Pp
m_index = 0; oW3|b2D
} 3o`c`;H%p
explicit bit_iterator() : m_container(0) [Nu py,v
{ bVOJp% *s
m_size = 8*sizeof(Container); a([8r- zP
m_index = m_size; a LJ
d1Q
} <jG[
z69)
bool operator* () \{;3'<
{ yZc#@R[0
char mask = 1; P.-
`[
char* pc = (char*)m_container; sPvjJ r"s
int i = (m_size-m_index-1)/8; E<\\/Q%w
int off = (m_size-m_index-1)%8; nhRpb9f`1@
mask <<=off; aole`PD,l
return pc & mask; UdcrX`^.
} lPw`KW
bit_iterator<Container>& operator++() qm< mw"]
{ F$jfPy-f
m_index++; ;),vUu,k
return *this; qO[_8's8
} JC
iB;!y
bit_iterator<Container>& operator++(int) j7~Rw"(XQc
{ 3L9@ELY4
m_index++; C4)m4r%
return *this; A=r8_.@2@
} PxA
OKUpI
bool operator==(bit_iterator<Container>& bitIt) h}Lrp r2r
{ f([d/
return m_index == bitIt.m_index; ?{\h`+A
} h_6c9VI
bool operator!=(bit_iterator<Container>& bitIt) ef2)k4)"
{ K9ek
return !(*this == bitIt); gv,1 CK
} >fzFNcO*
protected: wH+|
&C
Container* m_container; -PTfsQk
private: ~.CmiG.7
int m_size; sY:=bU^P
int m_index; ZqXp f
}; _gw paAJ
ij?Ww'p9>
用该迭代器可以将任意类型对象以二进制格式输出: WZ=$c]gG
double a = 10; c$x>6&&L
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));