以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 -TU7GCb=
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 @BbZ(cZ*
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 i@6MO'y
象当作char数组来处理。 xQ>c.}J/i
template<class Container> iJ~5A'?6
class bit_iterator : public std::iterator<bidirectional_iterator_tag, [3nhf<O
void, void> S5@/;T
{ 9qIUBH e
public: SDcxro|8i
explicit bit_iterator(Container& c) : m_container(&c) ZwAX+0
{ yHurt>8b[
m_size = 8*sizeof(Container); j2cLb
m_index = 0; <P'^olQ
} df
nmUE
explicit bit_iterator() : m_container(0) DIB Az s
{ =$}P'[V
m_size = 8*sizeof(Container); b=9(gZ 9
m_index = m_size; |VB}Kv
} `)`_G!a
bool operator* () D%LqLLD
{ o$'Fz[U
char mask = 1; >-r\]/^
char* pc = (char*)m_container; 95_?F7}9
int i = (m_size-m_index-1)/8; SIKy8?Fn
int off = (m_size-m_index-1)%8; 3I^KJ/)A
mask <<=off; brb8C%j}9
return pc & mask; zid?yuP
} #E2`KGCzW
bit_iterator<Container>& operator++() bS3qX{5
{ c,Zs.
kC
m_index++; " 6~pTHT
return *this; e!l!T@
pf
} st{:]yTRk
bit_iterator<Container>& operator++(int) Y">Q16(
{ D,mFme
m_index++; N ]}Re$5
return *this; X-3L4@T:?
} C]WVH\Pp
bool operator==(bit_iterator<Container>& bitIt) (*/P~$xIj
{ N,(@k[uta
return m_index == bitIt.m_index; vn
.wM
} {Xwin$C
bool operator!=(bit_iterator<Container>& bitIt) 1;fs`k0p
{ (8GJLs 8
return !(*this == bitIt); %N/I;`
} ;p BXAl
protected: XC?H
Container* m_container; jS5e"LMIq
private: J%aW^+O
int m_size; '&?47+W
int m_index; c[sC 2
}; b[uTt'p}
UldK lQ8
用该迭代器可以将任意类型对象以二进制格式输出: vW"x)~B
double a = 10; }C/}8<
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));