以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 UJ)(Sw
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 :9|CpC`.
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 tHJahK:"k
象当作char数组来处理。 dY?>:ce
template<class Container> 1mv8[^pF
class bit_iterator : public std::iterator<bidirectional_iterator_tag, /p{$HkVw
void, void> \NL*$SnxP
{ q] '2'"k
public: !imjfkG
explicit bit_iterator(Container& c) : m_container(&c) ?KFj=Yo
{ |v"&Y
m_size = 8*sizeof(Container); U uSCqI};
m_index = 0; {UuSNZ[^
} w!l*!G
explicit bit_iterator() : m_container(0) %G,d&%f
{ 0[-@<w ^j
m_size = 8*sizeof(Container); `9DW}
m_index = m_size; DPWnvd
} |zp}u (N
bool operator* () @(m?j1!M
{ ZY)&Fam}
char mask = 1; )%I62<N,z
char* pc = (char*)m_container; 1[(/{CClB
int i = (m_size-m_index-1)/8; \2[
int off = (m_size-m_index-1)%8; qD(dAU
mask <<=off; KhNE_.
Z
return pc & mask; =nUzBL%~
} ;+~Phdy
bit_iterator<Container>& operator++() 5Noy~;
{ 'DB'lP
m_index++; ~#:R1~rh\e
return *this; jGn2QL
} )Q~K\bJf
bit_iterator<Container>& operator++(int) E#yG}UWe
{ !h+VbZ
m_index++; #PMi6q~Z
return *this; Gr|102
} K1*V \WRW5
bool operator==(bit_iterator<Container>& bitIt) _lZWy$rm%
{ ghaO#kI
return m_index == bitIt.m_index; 6M6r&,yRu
} i=`@)E
bool operator!=(bit_iterator<Container>& bitIt) Nj}-"R\u
{ hx!hI1
return !(*this == bitIt); aB~=WWLR\
} 4^K<RSYs
protected: 7HQ|3rt
Container* m_container; :w26d-QR(
private: #D Oui]
int m_size; +{&++^(}a
int m_index; .10$n*
}; g$9s}\6B
9y;8JO
用该迭代器可以将任意类型对象以二进制格式输出: cD9axlJ
double a = 10; $&FeR*$|g
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));