以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 w
tSX(LNY
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 7v]9) W=y
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 hZwJ@ Vm#
象当作char数组来处理。 %R m`+
template<class Container> !cNw8"SIU
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 1)v]<Ga~%1
void, void> #fT<]j(
{ zTS P8Q7
public: hmp!|Q[)
explicit bit_iterator(Container& c) : m_container(&c) :sA$LNj}
{ CXd/M~:!
m_size = 8*sizeof(Container); P={8qln,X
m_index = 0; vugGMP;D(
}
x=YV*
explicit bit_iterator() : m_container(0) Vqp3'=No
{ N'n\_ x
m_size = 8*sizeof(Container); :878q TB
m_index = m_size; KvY1bMU!
} *|Bt!
bool operator* () Ju"K"
{ Z# o;H$
char mask = 1; xua
E\*m
char* pc = (char*)m_container; U^
;H{S
int i = (m_size-m_index-1)/8; vR*p1Kq:
int off = (m_size-m_index-1)%8; y#v<V1b]
mask <<=off; t~_bquGk
return pc & mask; h[i@c`3/2
} 12LGWhDp
bit_iterator<Container>& operator++() nxhn|v
{ ^?R8>97_?
m_index++; 8fWk C<f}
return *this; \V%l.P4>e
} m<I>NYfE
bit_iterator<Container>& operator++(int) <_3OiU=w
{ [ XBVES8
m_index++; Lhmb=
@
return *this; h[>Puoz
} nA#N ,^Rr
bool operator==(bit_iterator<Container>& bitIt) <`")Zxf+
{ &`I 7aP|
return m_index == bitIt.m_index; 4Qj@:b
} ):Pzsz7
bool operator!=(bit_iterator<Container>& bitIt) S1U>Q~ZPA
{ jg\FD51$
return !(*this == bitIt); ZW%;"5uVm)
} |"aop|
protected: BI6]{ ZC"
Container* m_container; "@(Sw>*o
private: \\Te\l|L
int m_size; YckLz01jh
int m_index; )R6-]TkA_
}; $0&<Jx
xz3|m
_)
用该迭代器可以将任意类型对象以二进制格式输出: H: ]'r5sw
double a = 10; iyTKy+3A
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));