以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 !Z1@}`V&;
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 S;Fi?M
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 {B~QQMEow
象当作char数组来处理。 9=s<Ld
template<class Container> ko!)s
class bit_iterator : public std::iterator<bidirectional_iterator_tag, kXViWOXU^
void, void> EfqX
y>W
{ [CY9^N
public: v_yw@
explicit bit_iterator(Container& c) : m_container(&c) t$` r4Lb9/
{ `~cqAs}6]Q
m_size = 8*sizeof(Container); ___~D
dq
m_index = 0;
\__i
} aEB_#1
explicit bit_iterator() : m_container(0) :@yEQ#nFp
{ Jx:Y-$
m_size = 8*sizeof(Container); A@`}c,G
m_index = m_size; L7l
FtX+b
} kj Jn2c:y
bool operator* () =0
#OU
{ ::`HQ@^
char mask = 1; 9p]QM)M
char* pc = (char*)m_container; gM&{=WDG6
int i = (m_size-m_index-1)/8; wH*-(*N"
int off = (m_size-m_index-1)%8; 7 W5@TWM
mask <<=off; jVi) Efy
return pc & mask; td$E/h=3
} IYv`IS"
bit_iterator<Container>& operator++() X;$+,&M"
{ z 'Hw
m_index++; yNPVOp*
return *this; xR~hwj
} ibcRU y0%
bit_iterator<Container>& operator++(int) `>o{P/HN
{ hDDn,uzpd
m_index++; J4hL_iCQ
return *this; Zpt\p7WQ
} Cp\6W[2+B
bool operator==(bit_iterator<Container>& bitIt) poE0{HOU
{ ~g91Pr
return m_index == bitIt.m_index; #<fRE"v:Q
} ZtNN<7
bool operator!=(bit_iterator<Container>& bitIt) cZ,b?I"Q%
{ wLIMv3;k
return !(*this == bitIt); soxc0OlN
} yxPazz
protected: 2Ah#<k-gC;
Container* m_container; {p2!|A&a
private: 9
ql~q
int m_size; RHW]Z
Pr<
int m_index; AI2)g1m
}; z^B,:5Tt
D\v+wp.
用该迭代器可以将任意类型对象以二进制格式输出: +Ze}B*0
double a = 10; hPkp;a #
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));