以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 uE}A-\G
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 %:DH_0
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对
RAh4#8]
象当作char数组来处理。 whoQA}X>
template<class Container> @C?.)#
class bit_iterator : public std::iterator<bidirectional_iterator_tag, A\1X- Mm
void, void> Z#1'STg
{ FVgE^_
public: /3!c
;(
explicit bit_iterator(Container& c) : m_container(&c) 9c}mAg4
{ a9"1a'
m_size = 8*sizeof(Container); KcK,%!>B
m_index = 0; >,&@j,?']
} o-f;$]yp>
explicit bit_iterator() : m_container(0) ==?!z<I.d
{ |BC/ERms
m_size = 8*sizeof(Container); A0@E^bG
m_index = m_size; He}uE0^
} p:/#nmC<
bool operator* () &Oxf^x["]
{ !L=RhMI
char mask = 1; +'@j~\>^yJ
char* pc = (char*)m_container; nc.(bb),
int i = (m_size-m_index-1)/8; 2j UEL=+Y
int off = (m_size-m_index-1)%8; FD+y?UF
mask <<=off; \?VNr2
return pc & mask; eL` }j9
} C~r(*nr
bit_iterator<Container>& operator++() A.%MrgOOX
{ ,?k~>,{3
m_index++; ,*r}23
return *this; z87_/(nu
} :9O"?FE
bit_iterator<Container>& operator++(int) `/4R$E{
{ DA(ur'D
m_index++; dYn<L/#
return *this; *wd@YMOP
} xaSg'8-
bool operator==(bit_iterator<Container>& bitIt) .Z0$KQ'iy
{ _Z>I"m
return m_index == bitIt.m_index; {j!jm5
} ?e. Ge0&
bool operator!=(bit_iterator<Container>& bitIt) 1>pFUf|cV
{ 43HZ)3!me
return !(*this == bitIt); &l0-0T>
} yG ,oSp|
protected: #j?SdQ
Container* m_container; x&N!SU6
private: B'kV.3t
int m_size; s;9>YV2at
int m_index; ,+Bp>=pvs
}; w9W0j
[l7 G9T}/[
用该迭代器可以将任意类型对象以二进制格式输出: 0?0$6F
double a = 10; .GM}3(1fX`
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));