以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 b]BA,D4
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 sjgR \`AU
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 >` QX
xTn
象当作char数组来处理。 g{hA,-3
template<class Container> Rk%M~ D*-
class bit_iterator : public std::iterator<bidirectional_iterator_tag, +3>/,w(x
void, void> G3+a+=e
{ D~Ohw sL4
public: rVy\,#|
explicit bit_iterator(Container& c) : m_container(&c) *hs<Ez.cC
{ p0y?GNQ
m_size = 8*sizeof(Container); !h>$bm
m_index = 0; p,\bez
} -/c1qLdQ
explicit bit_iterator() : m_container(0) j#P4Le[t
{ K=TW}ZO
m_size = 8*sizeof(Container); i%PHYSJ.
m_index = m_size; O^weUpe\
} YO$b#
bool operator* () T1HiHvJ
{ Xl6ZV,1=n7
char mask = 1; cGta4;
char* pc = (char*)m_container; IQ=|Kj9h
int i = (m_size-m_index-1)/8; K)UOx#xe1
int off = (m_size-m_index-1)%8; "!6~*!]c
mask <<=off; 8M+F!1-#
return pc & mask; xKST-:c +
} ?{,)XFck
bit_iterator<Container>& operator++() 14 'x-w^~k
{ up3<=u{>
m_index++; |/=p
return *this; n UCk0:{
} EJaaW&>[
bit_iterator<Container>& operator++(int) L_ qv<iM$
{ RK:sQWG
m_index++; /{MH'
return *this; efkie}
} e=;@L3f
bool operator==(bit_iterator<Container>& bitIt) UN?T}p-
oF
{ C%?D E@k
return m_index == bitIt.m_index; {_ho!OS>
} {C0^D*U:
bool operator!=(bit_iterator<Container>& bitIt)
"rDzrz
{ }_ :#fE
return !(*this == bitIt); =tRe3o0(
} {R!TUQ5
protected: 8tRhV2
Container* m_container; +Y9D!=_lj
private: -_*XhD
int m_size; B
m@oB2x)
int m_index; TgE.=` "7
}; k=~pA iRDN
>wk=`&+V@
用该迭代器可以将任意类型对象以二进制格式输出: b;`#Sea
double a = 10; gc:p@<
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));