以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 [/fwt!
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 tr9_bl&z
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ^&Rxui
象当作char数组来处理。 c|;|%"Mk
template<class Container> !Z0rTC3d
class bit_iterator : public std::iterator<bidirectional_iterator_tag, r{6B+3J
void, void> 9'/ |?I
{ #QyK?i*
public: G~iYF(:&
explicit bit_iterator(Container& c) : m_container(&c) q3pN/f;kr,
{ r* /XB0
m_size = 8*sizeof(Container); }T1Xds8w)t
m_index = 0; z7us*8X{
} nm:let7GB
explicit bit_iterator() : m_container(0) V~uA(3\U
{ e2=,n6N]c
m_size = 8*sizeof(Container); - R8!"~o
m_index = m_size; =ZJ?xA8
} wor'=byh\
bool operator* () >!v,`O1
{ g#KToOP
char mask = 1; MIXrLh3
char* pc = (char*)m_container; I?B,rT3h
int i = (m_size-m_index-1)/8; p TV@nP
int off = (m_size-m_index-1)%8; &T{B~i3w8
mask <<=off; R82Zr@_
return pc & mask; *O}'2Ht6\
} M]/wei"X
bit_iterator<Container>& operator++() .V )2Tz
{ G4J6
m_index++; _ry En
return *this; !k??Kj
} x8rFMR#S=
bit_iterator<Container>& operator++(int) X#NeB>~
{ r|H!s,
m_index++; 3TvhOC>yG
return *this; aXid;v,
} &+w!'LSaD
bool operator==(bit_iterator<Container>& bitIt) 1r:fxZO\Vd
{ 7J!d3j2TR
return m_index == bitIt.m_index; g]#zWTw(
} 8wx#,Xa
bool operator!=(bit_iterator<Container>& bitIt) H1ui#5n2
{ d# ?*62
return !(*this == bitIt); /wRK[i
} ;KZ2L~
THG
protected: kc(b;EA
Container* m_container; -mYI[AG)
private: |u@>[*k'=
int m_size; 1eR{~ ,
int m_index; yI)fu^
}; uY%3X/^j
YrcC"
用该迭代器可以将任意类型对象以二进制格式输出: =z/mI y<
double a = 10; yar IR|
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));