以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 Y{`3`Pg&N
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 x!Y( Y=i>
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 N" 8*FiZ|
象当作char数组来处理。 F1zT )wW
template<class Container> 3@%BA(M
class bit_iterator : public std::iterator<bidirectional_iterator_tag, pFG]IM7o/u
void, void> 1mAUEQ!
{ Al)lWD}j2g
public: }7otuO(pRo
explicit bit_iterator(Container& c) : m_container(&c) F%9e@{
{ lrq>TJEcx
m_size = 8*sizeof(Container); (q0No26;(
m_index = 0; 7O]J^H+7
} "Wxo[I
explicit bit_iterator() : m_container(0) A3m{jbh
{ q|?`Gsr
m_size = 8*sizeof(Container); 8|fLe\"
m_index = m_size; D<lQoO+
} Cln^ 1N0
bool operator* () <aD'$(N5
{ jt0H5-x
char mask = 1; tvGg@Xs\
char* pc = (char*)m_container; hqdC9?\
int i = (m_size-m_index-1)/8; 't||F1X~J
int off = (m_size-m_index-1)%8; >|y>e{P
mask <<=off; ,ZsYXW
return pc & mask; 7g {g}
} Cij$GYkv
bit_iterator<Container>& operator++() MH C.k=
{ |k/`WC6As.
m_index++; U]+b`m
return *this; GG@iKL V
} d<e+__2
bit_iterator<Container>& operator++(int) uZo]8mV
{ 7[(Lrx.pM
m_index++; * [iity
return *this; BXagSenc
}
zZS>+O
bool operator==(bit_iterator<Container>& bitIt) J
r=REa0
{ ){?mKB5
return m_index == bitIt.m_index; yBUZVqqDa
} r@N39O*Wq
bool operator!=(bit_iterator<Container>& bitIt) LG"BfYy6
{ ,AGM?&A
return !(*this == bitIt); .aVHd<M
} Uqb]e?@
protected: g6x/f<2x
Container* m_container; S,ouj;B
private: we6+2
int m_size; (CKhY~,/u
int m_index; ,(1vEE[9-
}; (,d4"C
@]?? +f}#
用该迭代器可以将任意类型对象以二进制格式输出: :mCw.Jz<h
double a = 10; LZ=wz.'u
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));