以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 xpCzx=n3.m
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 M]4qS('[
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 Tj7OV}:
象当作char数组来处理。 649{\;*4
template<class Container> LsH&`G^<
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ^
cpQ*Fz
void, void> s kC*
{ #Jp_y|
public: !2R~/Rg
explicit bit_iterator(Container& c) : m_container(&c) Ss6mN;&D
{ QxZYy}2
m_size = 8*sizeof(Container); <9z2:^
m_index = 0; *@/1]W
} 1Q"w)Ta
explicit bit_iterator() : m_container(0) R#gt~]x6k
{ d/5i4g[q
m_size = 8*sizeof(Container); AdB B#zd
m_index = m_size; soh)IfZ
} @yiAi:v@
bool operator* () H~IR:WOw
{ `>KB8SY:qK
char mask = 1; 95LZG1]Rb
char* pc = (char*)m_container; =?g26>dYo
int i = (m_size-m_index-1)/8; Z-X(.Q
int off = (m_size-m_index-1)%8; bC*( ,n<'
mask <<=off; 6-#<*Pg
return pc & mask; (3a]#`Q
} OXcQMVa
6
bit_iterator<Container>& operator++() Dx`-Kg_p
{ 8g0By;h;
m_index++; g}
\$9
return *this; .<&o, D
} aVkgE>
bit_iterator<Container>& operator++(int) NwPGH=V
{ j#L"fW^GM
m_index++; JrlDTNJj'
return *this; 4M4Y2fBH
} DP{kin"4I
bool operator==(bit_iterator<Container>& bitIt) K8`Jl=}z%&
{ [ u7p:?WDW
return m_index == bitIt.m_index; F/,K8<|r>
} 4)MKYhm
bool operator!=(bit_iterator<Container>& bitIt) =)_9GO
{ A+Uil\%
return !(*this == bitIt); *nJy
} 6[3oOO:uo
protected: \yt-_W=[
Container* m_container; Sl,X*[HGd
private: Mj&`Y
gW5a
int m_size; u'Ja9m1
int m_index; 3ht>eaHi
}; n^vL9n_N
S:!gj2q9|
用该迭代器可以将任意类型对象以二进制格式输出: c#o(y6
double a = 10; %c+`8 wj
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));