以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 5Ocd2T'
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 /%E l0X
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 gk"0r\Eq
象当作char数组来处理。 L*;XjacI]
template<class Container> 4 1w*<{Lk
class bit_iterator : public std::iterator<bidirectional_iterator_tag, r:[N#*kK
void, void> 7+I%0U}m
{ 9ghZLQ
public: ttazY#
explicit bit_iterator(Container& c) : m_container(&c) ~]+-<O^U~
{ }LXS!Ff:
m_size = 8*sizeof(Container); 3=6`'PKRQ
m_index = 0; 1`t4wD$/
} mcbr3P
explicit bit_iterator() : m_container(0) ~i`@
{ u"rK5'
m_size = 8*sizeof(Container);
tCT-cs
m_index = m_size; -P|EV|8=
} [x`trypg
bool operator* () l[KFK%?
{ Y)?dq(
char mask = 1; Z3:M%)e_u$
char* pc = (char*)m_container; I6bekOvP
int i = (m_size-m_index-1)/8; <SiD m-=E
int off = (m_size-m_index-1)%8; 7@[3]c<=
mask <<=off; bjgf8427I
return pc & mask; 4nC`DJ;V
} p&B
c<+3e
bit_iterator<Container>& operator++() jft%\sY
{ a&>Tk%
m_index++; %+PWcCmn
return *this; J.
]~J|K
} b`x7%?Qn
bit_iterator<Container>& operator++(int) P3w]PG@
{ 2C9wOO
m_index++; :} r^sD
return *this; nWTo$*>W
} HOWm""IkB
bool operator==(bit_iterator<Container>& bitIt) S@AHI!"h=V
{ g[VVxp!C<
return m_index == bitIt.m_index; R<}WNZl
} E0K'|*
bool operator!=(bit_iterator<Container>& bitIt) $=>(7 =l_
{ P4"Pb\o*
return !(*this == bitIt); B7:8%r/
} %GRD3S
protected: | aH;@V
Container* m_container; j@4
yRl ^
private: %O5
k+~9
int m_size; txF)R[dZK
int m_index; `;[j`v8O
}; @agW{%R:.
uZsm=('ww
用该迭代器可以将任意类型对象以二进制格式输出: 1<hj3
double a = 10; ^i3~i?\,P
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));