以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 lt yhYPS
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 T+PERz(
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 TrNh,5+b
象当作char数组来处理。 a]J>2A@-I
template<class Container> l
GJ N;G7
class bit_iterator : public std::iterator<bidirectional_iterator_tag, h7 mk<
void, void> 'J)9#
{ ,4k3C#!.i
public: @vL0gzE?nB
explicit bit_iterator(Container& c) : m_container(&c) y4VO\N!
{ VtMnLFMw
m_size = 8*sizeof(Container); $
nMx#~>a
m_index = 0; r?|(t?
} g-H,*^g+
explicit bit_iterator() : m_container(0) W)^%/lAh
{ b~{nS,_Rn
m_size = 8*sizeof(Container); q,OCA\
m_index = m_size; *,)1Dcv(
} J\N&u#
bool operator* () &XW~l>!+
{ 5=fS^]- F
char mask = 1; WR u/7$8
char* pc = (char*)m_container; D&=+PAX
int i = (m_size-m_index-1)/8; nm)/BK
int off = (m_size-m_index-1)%8; JEK_W<BD
mask <<=off; (=j/"Mb
return pc & mask; qiq=v)
} O|+$9#,
bit_iterator<Container>& operator++() 0b<Qs88yd>
{ F0"("4h:
m_index++; a'?LC)^
return *this; UR(i_T&w
} c[;A$P=
8.
bit_iterator<Container>& operator++(int) xiL+s-
{ 'Hgk$Im+
m_index++; /`t}5U>S_
return *this; S_^;#=_c
} =iB$4d2
bool operator==(bit_iterator<Container>& bitIt) Pb1.X9*8c
{ EztuVe
return m_index == bitIt.m_index; GnCs_[*&r
} *^XMf
bool operator!=(bit_iterator<Container>& bitIt) e.Jaq^Gw|
{ 1/syzHjbY
return !(*this == bitIt); _n4_;0
} i2-]Xl
protected: C' WX$!$d
Container* m_container; 3lKs>HE0
private: TH55@1W,[
int m_size; ~@e=+Z
int m_index; ,|]k4F
}; I,"q:QS+
b2RW=m-
用该迭代器可以将任意类型对象以二进制格式输出: 9!0-~,o
double a = 10; vP_mS 4X
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));