以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 ,RYahu
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 %ylpn7I\6
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 D$vP&7pOr4
象当作char数组来处理。 f:K3 P[|
template<class Container> "x"y3v'
class bit_iterator : public std::iterator<bidirectional_iterator_tag, -|/kg7IO\
void, void> #R#o/@|
{ nWzGb2Y
public: q@6Je(H
explicit bit_iterator(Container& c) : m_container(&c) n#fc=L1U
{ `(dRb
m_size = 8*sizeof(Container); &l| :1
m_index = 0; >.}ewz&9o
} km[PbC
explicit bit_iterator() : m_container(0) sO;]l"{<
{ j\^u_D
m_size = 8*sizeof(Container); =#Qm D=
m_index = m_size; f[;l7
} !P"=57d}"l
bool operator* () h5>38Kd
{ J ;e/S6l
char mask = 1; X"z!52*3]
char* pc = (char*)m_container; ==W`qC4n?n
int i = (m_size-m_index-1)/8; $S(q;Y
int off = (m_size-m_index-1)%8; `J}-U\4F{
mask <<=off; N:yyDeGyW
return pc & mask; F,l%SQCyj
} Ac@zTK6>
bit_iterator<Container>& operator++() @U;U0
{ K7
N)VG
m_index++; zV<vwIUrr
return *this; U}]uPvu
} ^HM9'*&KJ
bit_iterator<Container>& operator++(int) g12mSbf=9
{ u3XQ<N{Gj
m_index++; ktMUTL(B
return *this; F]"Hs>
} (XDK&]U
bool operator==(bit_iterator<Container>& bitIt) >FRJvZ6
{ )ZP-t!).G#
return m_index == bitIt.m_index; w&E*{{otJ
} dAZh# i[
bool operator!=(bit_iterator<Container>& bitIt) )U':NV2
{ NL-<K
return !(*this == bitIt); #P''+$5,
} J% t[{
protected: z12c9k%s
Container* m_container; IRxFcLk
private: )&$Zt(
int m_size; U'8ub(:&
int m_index; ny,a5zEnF
}; p7YfOUo
k
"Y7
]t:8
用该迭代器可以将任意类型对象以二进制格式输出: ;Npv 2yAab
double a = 10; )7j CEA03
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));