以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 -[!t=qi
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 H8g6ZCU~
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 "E<+idoz
象当作char数组来处理。 62;xK-U
template<class Container> /nv*OKS|
class bit_iterator : public std::iterator<bidirectional_iterator_tag, V+D <626o
void, void> 4SUzR\
{ kjQW9QJ<
public: I>rTqOK
explicit bit_iterator(Container& c) : m_container(&c) {$t*XTY6R
{ |t"CH'KJZ
m_size = 8*sizeof(Container); #P!<u Lc%
m_index = 0; d&G]k!|\
}
9PV]bt,
explicit bit_iterator() : m_container(0) 0"j:-1
{ Xz:ha>}C
m_size = 8*sizeof(Container); l4mRNYv)z
m_index = m_size; )cL(()N
} D,*|:i
bool operator* () ta5_k&3N
{ erv94acq
char mask = 1; f4,|D |
char* pc = (char*)m_container; ]' n4e*
int i = (m_size-m_index-1)/8; XXm7rn
int off = (m_size-m_index-1)%8; L!Tvz(_7f6
mask <<=off; ?=)lbSu
K
return pc & mask; P )oNNY6}
} c?<)!9:
bit_iterator<Container>& operator++() #oiU|>3Y
{ 22ySMtxn
m_index++; L9^M?.a
return *this; )^P54_2
} "]2^O
bit_iterator<Container>& operator++(int) 2 Y9u9;ah
{ Q)XH5C2X
m_index++; m<#^c?u
return *this; =mX26l`B
} r"K!]Vw
bool operator==(bit_iterator<Container>& bitIt) fp(zd;BSQ
{ +VQD'
return m_index == bitIt.m_index; :B=Gb8?
} K2Ro0
bool operator!=(bit_iterator<Container>& bitIt) Is6}VLbB
{ ) x+edYw
return !(*this == bitIt); l -nH
} f`;w@gR`=
protected: sMVk]Mb
Container* m_container; <L*`WO]\l
private: 7.
$wK.
int m_size; <-'
!I&
int m_index; A4rMJ+!5
}; cR!M{U.q
/zXOtaG
用该迭代器可以将任意类型对象以二进制格式输出: 7@g0>1Fz
double a = 10; ex`T9j.=B
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));